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 simplement threading 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 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