Maximale Größe für multiprocessing.Queue-Element?
Arbeite ich an einem ziemlich großen Projekt in Python, das erfordert eine der compute-intensive hintergrund-tasks übergeben werden, um einen anderen Kern, so dass die wichtigsten service wird nicht verlangsamt. Ich bin gekommen, über einige scheinbar seltsame Verhalten beim Einsatz multiprocessing.Queue
zu kommunizieren, die Ergebnisse aus dem Arbeitsprozess. Mit der gleichen Warteschlange für beide eine threading.Thread
und ein multiprocessing.Process
zum Vergleich, der thread funktioniert Prima, aber der Prozess nicht beitreten, nachdem er ein großes Element in der Warteschlange. Beachten Sie:
import threading
import multiprocessing
class WorkerThread(threading.Thread):
def __init__(self, queue, size):
threading.Thread.__init__(self)
self.queue = queue
self.size = size
def run(self):
self.queue.put(range(size))
class WorkerProcess(multiprocessing.Process):
def __init__(self, queue, size):
multiprocessing.Process.__init__(self)
self.queue = queue
self.size = size
def run(self):
self.queue.put(range(size))
if __name__ == "__main__":
size = 100000
queue = multiprocessing.Queue()
worker_t = WorkerThread(queue, size)
worker_p = WorkerProcess(queue, size)
worker_t.start()
worker_t.join()
print 'thread results length:', len(queue.get())
worker_p.start()
worker_p.join()
print 'process results length:', len(queue.get())
Habe ich gesehen, dass dies funktioniert gut für size = 10000
, aber hängt bei worker_p.join()
für size = 100000
. Gibt es einige inhärente Größe, die Begrenzung, was multiprocessing.Process
Instanzen können in eine multiprocessing.Queue
? Oder bin ich es, einige offensichtliche, grundlegende Fehler hier?
Referenz, ich bin mit Python 2.6.5 auf Ubuntu 10.04.
InformationsquelleAutor Brendan Wood | 2012-04-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint die zugrunde liegende Rohr ist voll, so dass die feeder-thread blocks auf das schreiben, um das Rohr (eigentlich, wenn Sie versuchen, die Sperre zum Schutz der Leitung bei gleichzeitigem Zugriff).
Überprüfen dieses Problem http://bugs.python.org/issue8237
ich danke Ihnen so sehr. nur die swap-2 Zeilen: "worker_t.join() print " thread Ergebnissen Länge:', len(queue.get())"
InformationsquelleAutor Maksym Polshcha
Standardmäßig maxsize der Warteschlange ist unendlich, aber Sie haben über-geritten. In Ihrem Fall, worker_p setzen Element in der Warteschlange, die Warteschlange freigegeben werden soll, bis Sie vor dem Aufruf anzuschließen. Bitte siehe link unten für details.
https://docs.python.org/2/library/multiprocessing.html#programming-guidelines
InformationsquelleAutor YATIN KAREL
Die Antwort auf python-multiprocessing: einige Funktionen nicht zurückgegeben werden, wenn Sie komplett sind (Warteschlange material zu groß) implementiert, was du wahrscheinlich meinst mit "entfernen", bevor er" in eine parallele Ausführung eines beliebigen Satz von Funktionen, deren Rückgabewerte bekommen in der Warteschlange.
So lässt sich für jede Größe von Zeug, um in Warteschlangen gestellt, so dass die Grenze, die Sie fand nicht in der Weise.
InformationsquelleAutor CPBL