Kann ich eine Multiprocessing-Warteschlange in einer Funktion verwenden, die von Pool.imap aufgerufen wird?

Ich bin mit python 2.7 und versuchen, einige CPU-Intensive Aufgaben in Ihre eigenen Prozesse. Ich möchte in der Lage sein, Nachrichten zu senden, zurück zum übergeordneten Prozess es zu halten informiert über den aktuellen status des Prozesses. Die multiprocessing Queue scheint perfekt für diese, aber ich kann nicht herausfinden, wie es funktioniert.

So, dies ist meine grundlegende arbeiten Beispiel minus die Nutzung einer Warteschlange.

import multiprocessing as mp
import time

def f(x):
    return x*x

def main():
    pool = mp.Pool()
    results = pool.imap_unordered(f, range(1, 6))
    time.sleep(1)

    print str(results.next())

    pool.close()
    pool.join()

if __name__ == '__main__':
    main()

Habe ich versucht, vorbei an der Warteschlange in mehrere Arten, und Sie erhalten die Fehlermeldung "Absturz mit Laufzeitfehler: Queue-Objekte sollten nur dann geteilt werden zwischen Prozessen durch Vererbung". Hier ist eine der Möglichkeiten, die ich habe versucht, basierend auf einer früheren Antwort habe ich gefunden. (Ich bekomme das gleiche problem versucht, mit Pool.map_async und Pool.imap)

import multiprocessing as mp
import time

def f(args):
    x = args[0]
    q = args[1]
    q.put(str(x))
    time.sleep(0.1)
    return x*x

def main():
    q = mp.Queue()
    pool = mp.Pool()
    results = pool.imap_unordered(f, ([i, q] for i in range(1, 6)))

    print str(q.get())

    pool.close()
    pool.join()

if __name__ == '__main__':
    main()

Schließlich das 0 fitness-Ansatz (global) erzeugt keine Nachrichten, es ist nur blockiert.

import multiprocessing as mp
import time

q = mp.Queue()

def f(x):
    q.put(str(x))
    return x*x

def main():
    pool = mp.Pool()
    results = pool.imap_unordered(f, range(1, 6))
    time.sleep(1)

    print q.get()

    pool.close()
    pool.join()

if __name__ == '__main__':
    main()

Ich bin mir bewusst, dass es wohl die Arbeit mit multiprocessing.Prozess direkt und, dass es andere Bibliotheken, um dies zu erreichen, aber ich hasse es, wieder Weg von der standard-Bibliothek Funktionen, die eine gute Passform, bis ich bin sicher, es ist nicht nur mein Mangel an wissen hält mich in der Lage, Sie zu verwerten.

Dank.

InformationsquelleAutor der Frage Olson | 2010-09-30

Schreibe einen Kommentar