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.map
wird, 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 ProcessPoolExecutor
ist auch zwei Zeilen ( .map
gibt 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, SimpleQueue
wenn Sie nur put
und benötigen get
. Die erste Schleife startet alle Prozesse, bevor die zweite die blockierenden queue.get
Aufrufe ausführt . Ich glaube nicht, dass es einen Grund gibt, auch anzurufen p.join()
.
multiprocessing.Queue
eher die Verwendung von a als vonManager
hier empfehlen . Die Verwendung vonManager
erfordert das Laichen eines völlig neuen Prozesses, der übertrieben ist, wenn aQueue
dies tun würde.