J'ai pensé simplifier les exemples les plus simples copiés de l'exemple ci-dessus, qui fonctionnent pour moi sur Py3.6. Le plus simple est multiprocessing.Pool
:
import multiprocessing
import time
def worker(x):
time.sleep(1)
return x
pool = multiprocessing.Pool()
print(pool.map(worker, range(10)))
Vous pouvez définir le nombre de processus dans le pool avec, par exemple, Pool(processes=5)
. Cependant, il s'agit par défaut du nombre de CPU, alors laissez-le vide pour les tâches liées au CPU. (Les tâches liées aux E/S conviennent souvent aux threads de toute façon, car les threads sont principalement en attente et peuvent donc partager un cœur de CPU). Pool
s'applique également optimisation des jonctions .
(Notez que la méthode worker ne peut pas être imbriquée dans une autre méthode. J'ai initialement défini ma méthode worker à l'intérieur de la méthode qui fait l'appel à la méthode pool.map
Mais les processus ne pouvaient pas l'importer et lançaient "AttributeError : Can't pickle local object outer_method..inner_method". Plus d'informations sur ici . Il peut être à l'intérieur d'une classe).
(Appréciez la question originale spécifiant l'impression 'represent!'
plutôt que time.sleep()
mais sans cela, je pensais que du code s'exécutait en même temps alors que ce n'était pas le cas).
Py3's ProcessPoolExecutor
est également de deux lignes ( .map
renvoie un générateur, vous avez donc besoin de l'option list()
):
from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor() as executor:
print(list(executor.map(worker, range(10))))
Avec des 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())
Utilisez SimpleQueue
si tout ce dont vous avez besoin est put
y get
. La première boucle démarre tous les processus, avant que la seconde n'effectue le blocage. queue.get
appels. Je ne pense pas qu'il y ait une raison d'appeler p.join()
aussi.