Quelle est la différence entre le pool de threads vs Piscine en Python module multiprocessing
Quoi la différence entre ThreadPool
et Pool
dans 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 le résultat suivant:
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 le résultat suivant:
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:
- pourquoi le “dehors __principaux__()” exécuter à chaque fois dans le
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 de
multiprocessing.pool.ThreadPool
plutôt que de simplementthreading
module?
Je ne vois pas de documentation officielle pour ThreadPool
n'importe où, quelqu'un peut m'aider où je peux le trouver?
Que je sache, en raison de GIL en Python, le multithreading de Python ressemble le multi-thread, mais ce n'est pas réel. Si vous voulez profiter de votre multi-cœurs avec python, vous devez utiliser le multi-traitement. Dans l'ordinateur moderne, la création d'un processus et un thread de création ont presque le même coût.
Création d'un thread peut avoir un coût similaire à la création d'un processus, mais la communication entre les threads sont très différentes coût de la communication entre les processus (à moins peut-être que vous avez utilisé de la mémoire partagée). Aussi, votre commentaire à propos de la GIL est que partiellement vrai: il est libéré lors d'opérations d'e/S et par certaines bibliothèques (par exemple, numpy), même pendant le CPU opérations. Encore, le GIL est en fin de compte la raison de l'utilisation des processus séparés en Python.
Que peut-être vrai sur *nix, grâce à l'utilisation de
Pour répondre à la question sur
Création d'un thread peut avoir un coût similaire à la création d'un processus, mais la communication entre les threads sont très différentes coût de la communication entre les processus (à moins peut-être que vous avez utilisé de la mémoire partagée). Aussi, votre commentaire à propos de la GIL est que partiellement vrai: il est libéré lors d'opérations d'e/S et par certaines bibliothèques (par exemple, numpy), même pendant le CPU opérations. Encore, le GIL est en fin de compte la raison de l'utilisation des processus séparés en Python.
Que peut-être vrai sur *nix, grâce à l'utilisation de
fork
, mais ce n'est pas vrai sur Windows et ne tient pas compte de la charge supplémentaire, les limites et la complexité de la communication entre les processus, par opposition à des discussions (sur toutes les plateformes).Pour répondre à la question sur
threading
contre ThreadPool
, dans threading
a rien de facile, moyen direct d'obtenir la valeur de retour(s) du travailleur fonctions. Alors que, dans ThreadPool
vous pouvez facilement obtenir la valeur de retour(s) du travailleur fonctions.OriginalL'auteur ozn | 2017-09-05
Vous devez vous connecter pour publier un commentaire.
La
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
être imprimé à plusieurs reprises avec l'
multiprocessing.Pool
est dû au fait que la piscine sera spawn 5 processus indépendants. Chaque processus d'initialiser son propre interpréteur Python et charger le module résultant dans le haut niveauprint
être exécutée de nouveau.Noter que cela se produit uniquement si le
spawn
processus de création de la méthode utilisée (méthode uniquement disponible sur Windows). Si vous utilisez lefork
un (Unix), vous verrez le message imprimé qu'une seule fois comme pour les threads.La
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 le code source.Je crois, la prochaine question est: quand utiliser un thread pool et quand utiliser un processus?
La règle de base est:
multiprocessing.pool.ThreadPool
multiprocessing.Pool
multiprocessing.Pool
en raison de l'avantage de l'isolation des processus apporteSur Python 3, vous voudrez peut-être jeter un oeil à la
simultanées.l'avenir.Exécuteur
piscine implémentations.L'explication est dans le lien que je vous ai donné ci-dessus, lorsque mentionner les spawn méthode de démarrage. Vous pouvez la contrôler, mais le début de méthodes en fonction de la disponibilité de la plate-forme OS. Je suppose que vous utilisez Windows comme de démarrage par défaut de la stratégie est la
spawn
. Si donc, il y a peu de faire ce que Windows uniquement de supportspawn
.Est le commentaire à propos de la mise en œuvre inachevée de
ThreadPool
encore valide jusqu'en 2019 avec Python 3.7?Oui, il est. Comme vous pouvez le voir à partir de la source liée et le manque de documentation.
Pourquoi IO lié emplois -> multitraitement.piscine.Pool de threads?
OriginalL'auteur noxdafox