Kann ich eine Multiprocessing Queue in einer von Pool.imap aufgerufenen Funktion verwenden?

Ich verwende Python 2.7 und versuche, einige CPU-schwere Aufgaben in eigenen Prozessen auszuführen. Ich möchte in der Lage sein, Nachrichten an den übergeordneten Prozess zurückzusenden, um ihn über den aktuellen Status des Prozesses auf dem Laufenden zu halten. Die Multiprocessing-Warteschlange scheint dafür perfekt zu sein, aber ich kann nicht herausfinden, wie sie funktioniert.

So, dies ist mein grundlegendes Arbeitsbeispiel, abzüglich der Verwendung 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()

Ich habe versucht, die Warteschlange auf verschiedene Arten zu übergeben, und sie erhalten die Fehlermeldung "RuntimeError: Warteschlangenobjekte sollten nur zwischen Prozessen durch Vererbung geteilt werden". Hier ist eine der Möglichkeiten, die ich basierend auf einer früheren Antwort ausprobiert habe. (Ich habe das gleiche Problem beim Versuch, Pool.map_async und Pool.imap zu verwenden)

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()

Finally, der 0-Fitness-Ansatz (mach ihn global) erzeugt keine Nachrichten, er blockiert nur.

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 wahrscheinlich mit Multiprocessing funktionieren wird. Verarbeiten Sie direkt und es gibt andere Bibliotheken, um dies zu erreichen, aber ich hasse es, mich von den Standard-Bibliotheksfunktionen zurückzuziehen, die gut passen, bis ich sicher bin, dass es nicht nur meine sind Mangel an Wissen hindert mich daran, sie auszunutzen.

Vielen Dank

Antworten auf die Frage(2)

Ihre Antwort auf die Frage