Python Language Multiprocessing.Pool


Exemple

La réponse simple à la question de savoir comment utiliser les threads dans Python est la suivante: "Ne le faites pas. Utilisez plutôt des processus." Le module de multitraitement vous permet de créer des processus avec une syntaxe similaire à la création de threads, mais je préfère utiliser leur objet Pool pratique.

En utilisant le code que David Beazley a d’abord utilisé pour montrer les dangers des threads sur le GIL , nous allons le réécrire à l’aide du multitraitement .

Le code de David Beazley qui a montré des problèmes de thread GIL

from threading import Thread
import time
def countdown(n):
    while n > 0:
        n -= 1

COUNT = 10000000

t1 = Thread(target=countdown,args=(COUNT/2,))
t2 = Thread(target=countdown,args=(COUNT/2,))
start = time.time()
t1.start();t2.start()
t1.join();t2.join()
end = time.time()
print end-start
Re-écrit en utilisant multiprocessing.Pool:
import multiprocessing
import time
def countdown(n):
    while n > 0:
        n -= 1

COUNT = 10000000

start = time.time()
with multiprocessing.Pool as pool:
    pool.map(countdown, [COUNT/2, COUNT/2])

    pool.close()
    pool.join()

end = time.time()
print(end-start)

Au lieu de créer des threads, cela crée de nouveaux processus. Comme chaque processus est son propre interpréteur, il n'y a pas de collision de GIL. multiprocessing.Pool ouvrira autant de processus qu'il y a de cœurs sur la machine, bien que dans l'exemple ci-dessus, il n'en faudrait que deux. Dans un scénario réel, vous souhaitez concevoir votre liste de manière à avoir au moins autant de longueur que des processeurs sur votre machine. Le pool exécutera la fonction que vous lui indiquez pour chaque argument, jusqu'au nombre de processus qu'il crée. Lorsque la fonction se termine, toutes les fonctions restantes dans la liste seront exécutées sur ce processus.

J'ai trouvé que, même en utilisant l'instruction with , si vous ne fermez pas et ne rejoignez pas le pool, les processus continuent d'exister. Pour nettoyer les ressources, je ferme et joignais toujours mes pools.