108 votes

Quelle est la différence entre ThreadPool et Pool dans le module de multitraitement Python

Quel est la différence entre ThreadPool et Pool en multiprocessing module. Lorsque j'essaie de mon code, c'est la principale différence que je vois:

from multiprocessing import Pool
import os, time

print("hi outside of main()")

def hello(x):
    print("inside hello()")
    print("Proccess id: ", os.getpid())
    time.sleep(3)
    return x*x

if __name__ == "__main__":
    p = Pool(5)
    pool_output = p.map(hello, range(3))

    print(pool_output)

Je vois la sortie suivante:

hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
inside hello()
Proccess id:  13268
inside hello()
Proccess id:  11104
inside hello()
Proccess id:  13064
[0, 1, 4]

Avec "Pool De Threads":

from multiprocessing.pool import ThreadPool
import os, time

print("hi outside of main()")

def hello(x):
    print("inside hello()")
    print("Proccess id: ", os.getpid())
    time.sleep(3)
    return x*x

if __name__ == "__main__":
    p = ThreadPool(5)
    pool_output = p.map(hello, range(3))

    print(pool_output)

Je vois la sortie suivante:

hi outside of main()
inside hello()
inside hello()
Proccess id:  15204
Proccess id:  15204
inside hello()
Proccess id:  15204
[0, 1, 4]

Mes questions sont les suivantes:

  • pourquoi le "dehors __principaux__()" exécuter à chaque fois dans l' Pool?

  • multiprocessing.pool.ThreadPool ne pas frayer de nouveaux processus? Il vient juste de créer de nouveaux threads?

  • Si oui quel est la différence entre l'utilisation d' multiprocessing.pool.ThreadPool contre seulement threading module?

Je ne vois pas de documentation officielle pour ThreadPool n'importe où, quelqu'un peut m'aider où je peux le trouver?

136voto

noxdafox Points 1339

L' multiprocessing.pool.ThreadPool le même comportement que l' multiprocessing.Pool avec la seule différence qui utilise des threads au lieu de processus à exécuter les travailleurs de la logique.

La raison pour laquelle vous voir

hi outside of main()

imprimé à plusieurs reprises avec l' multiprocessing.Pool est dû au fait que la piscine se frayer 5 processus indépendants. Chaque processus d'initialiser son propre interpréteur Python et charger le module résultant dans le haut niveau print être exécutée de nouveau.

Notez que cela n'arrive que si l' spawn processus de création de la méthode utilisée (méthode uniquement disponible sur Windows). Si vous utilisez l' fork d'un (Unix), vous verrez le message imprimé qu'une seule fois comme pour les threads.

L' multiprocessing.pool.ThreadPool n'est pas documentée à sa mise en œuvre n'a jamais été terminé. Il manque des tests et de la documentation. Vous pouvez voir sa mise en œuvre dans le code source.

Je crois que la prochaine question est: quand utiliser un thread pool et quand utiliser un processus basé sur une?

La règle de base est:

  • IO lié emplois -> multiprocessing.pool.ThreadPool
  • CPU emplois -> multiprocessing.Pool
  • Hybride emplois -> dépend de la charge de travail, d'habitude, je préfère l' multiprocessing.Pool en raison de l'avantage de l'isolation des processus apporte

Sur Python 3, vous voudrez peut-être jeter un coup d'oeil à l' concurrent.future.Executor piscine implémentations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X