Ich habe ein Skript, das erfolgreich eine Reihe von Aufgaben des Multiprocessing Pool mit einem imap_unordered()
Aufruf ausführt:
p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
p.join() # Wait for completion
Mein Wert num_tasks
liegt jedoch bei 250.000, sodass der join()
Haupt-Thread etwa 10 Sekunden lang gesperrt wird. Ich möchte in der Lage sein, schrittweise zur Befehlszeile zurückzukehren, um anzuzeigen, dass der Hauptprozess nicht gesperrt ist. Etwas wie:
p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
while (True):
remaining = rs.tasks_remaining() # How many of the map call haven't been done yet?
if (remaining == 0): break # Jump out of while loop
print "Waiting for", remaining, "tasks to complete..."
time.sleep(2)
Gibt es eine Methode für das Ergebnisobjekt oder den Pool selbst, die die Anzahl der verbleibenden Aufgaben angibt? Ich habe versucht, ein multiprocessing.Value
Objekt als Zähler zu verwenden ( do_work
ruft counter.value += 1
nach Ausführung seiner Aufgabe eine Aktion auf), aber der Zähler erreicht nur ~ 85% des Gesamtwerts, bevor das Inkrementieren gestoppt wird.