Ich dachte, ich würde die einfachsten Beispiele, die von oben kopiert wurden, vereinfachen und für mich an Py3.6 arbeiten. Am einfachsten ist multiprocessing.Pool:
import multiprocessing
import time
def worker(x):
time.sleep(1)
return x
pool = multiprocessing.Pool()
print(pool.map(worker, range(10)))
Sie können die Anzahl der Prozesse im Pool festlegen, z Pool(processes=5). Standardmäßig wird jedoch die CPU-Anzahl verwendet. Lassen Sie diese Option daher für CPU-gebundene Aufgaben leer. (E / A-gebundene Aufgaben passen ohnehin oft zu Threads, da die Threads meistens warten und einen CPU-Kern gemeinsam nutzen können.) WendetPool auch die Chunking-Optimierung an .
(Beachten Sie, dass die Worker-Methode nicht in einer Methode verschachtelt werden kann. Ich habe meine Worker-Methode zunächst in der Methode definiert, die aufgerufen pool.mapwird, um alles in sich geschlossen zu halten, aber dann konnten die Prozesse sie nicht importieren und haben "AttributeError" ausgelöst : Lokales Objekt Outer_Method..inner_method kann nicht ausgewählt werden. Mehr hier . Es kann sich innerhalb einer Klasse befinden.)
(Schätzen Sie den Druck der ursprünglichen Frage 'represent!' und nicht time.sleep(), aber ohne sie dachte ich, dass ein Code gleichzeitig ausgeführt wird, wenn dies nicht der Fall ist.)
Py3 ProcessPoolExecutorist auch zwei Zeilen ( .mapgibt einen Generator zurück, so dass Sie die benötigenlist() ):
from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor() as executor:
print(list(executor.map(worker, range(10))))
Mit schlicht Process es:
import multiprocessing
import time
def worker(x, queue):
time.sleep(1)
queue.put(x)
queue = multiprocessing.SimpleQueue()
tasks = range(10)
for task in tasks:
multiprocessing.Process(target=worker, args=(task, queue,)).start()
for _ in tasks:
print(queue.get())
Verwenden Sie, SimpleQueuewenn Sie nur putund benötigen get. Die erste Schleife startet alle Prozesse, bevor die zweite die blockierenden queue.getAufrufe ausführt . Ich glaube nicht, dass es einen Grund gibt, auch anzurufen p.join().
multiprocessing.Queueeher die Verwendung von a als vonManagerhier empfehlen . Die Verwendung vonManagererfordert das Laichen eines völlig neuen Prozesses, der übertrieben ist, wenn aQueuedies tun würde.