Question Multiprocessing vs Threading Python


J'essaie de comprendre les avantages de multitraitement plus de enfilage. je le sais multitraitement contourne le Global Interpreter Lock, mais quels autres avantages y at-il, et peut enfilage pas faire la même chose?


559
2018-06-15 11:12


origine


Réponses:


le threading module utilise des threads, le multiprocessing le module utilise des processus. La différence est que les threads s'exécutent dans le même espace mémoire, alors que les processus ont une mémoire séparée. Cela rend un peu plus difficile le partage d'objets entre les processus avec le multitraitement. Puisque les threads utilisent la même mémoire, des précautions doivent être prises ou deux threads écriront dans la même mémoire en même temps. C'est à cela que sert le verrou global de l'interpréteur.

Les processus de ponte sont un peu plus lents que les processus de ponte. Une fois qu'ils sont en cours d'exécution, il n'y a pas beaucoup de différence.


477
2018-06-15 11:19



Voici quelques avantages / inconvénients que j'ai trouvés.

Multiprocessing

Avantages

  • Séparez l'espace mémoire
  • Le code est généralement simple
  • Profite de plusieurs processeurs et noyaux
  • Évite les limitations de GIL pour cPython
  • Élimine la plupart des besoins en primitives de synchronisation, sauf si vous utilisez de la mémoire partagée (à la place, c'est plutôt un modèle de communication pour IPC)
  • Les processus enfants sont interruptibles / pouvant être mis à mort
  • Python multiprocessing module comprend des abstractions utiles avec une interface un peu comme threading.Thread
  • Un must avec cPython pour le traitement lié au CPU

Les inconvénients

  • IPC un peu plus compliqué avec plus de frais généraux (modèle de communication vs mémoire / objets partagés)
  • Plus grande empreinte mémoire

Enfiler

Avantages

  • Léger - faible empreinte mémoire
  • Mémoire partagée - facilite l'accès à l'état depuis un autre contexte
  • Vous permet de créer facilement des interfaces utilisateur réactives
  • Les modules d'extension cPython C qui libèrent correctement le GIL fonctionneront en parallèle
  • Excellente option pour les applications liées aux E / S

Les inconvénients

  • cPython - soumis au GIL
  • Non interruptible / tuable
  • Si vous ne suivez pas un modèle de pompe / file d'attente de commandes (en utilisant Queue module), puis l'utilisation manuelle des primitives de synchronisation devient une nécessité (les décisions sont nécessaires pour la granularité du verrouillage)
  • Le code est généralement plus difficile à comprendre et à corriger - le potentiel des conditions de course augmente considérablement

646
2018-06-15 14:39



Le travail de Threading consiste à permettre aux applications d'être réactives. Supposons que vous ayez une connexion à une base de données et que vous deviez répondre à une entrée de l'utilisateur. Sans threading, si la connexion à la base de données est occupée, l'application ne pourra pas répondre à l'utilisateur. En séparant la connexion de la base de données en un thread distinct, vous pouvez rendre l'application plus réactive. En outre, comme les deux threads sont dans le même processus, ils peuvent accéder aux mêmes structures de données: de bonnes performances et une conception logicielle flexible.

Notez que grâce à la GIL, l'application ne fait pas deux choses à la fois, mais nous avons placé le verrou de ressources sur la base de données dans un thread séparé afin que le temps CPU puisse être basculé entre elle et l'interaction utilisateur. Le temps CPU est rationné entre les threads.

Le multitraitement est pour les moments où vous voulez vraiment plus d'une chose à faire à un moment donné. Supposons que votre application doive se connecter à 6 bases de données et effectuer une transformation matricielle complexe sur chaque ensemble de données. Mettre chaque travail dans un thread séparé peut aider un peu parce que quand une connexion est inactive, une autre pourrait gagner du temps CPU, mais le traitement ne se ferait pas en parallèle car le GIL signifie que vous n'utilisez que les ressources d'un CPU . En plaçant chaque travail dans un processus de multitraitement, chacun peut fonctionner sur son propre processeur et fonctionner à pleine efficacité.


155
2018-06-15 13:38



L'avantage clé est l'isolement. Un processus d'écrasement n'abattra pas d'autres processus, alors qu'un thread écrasant causera probablement des ravages avec d'autres threads.


34
2018-06-15 11:15



Une autre chose non mentionnée est que cela dépend de l'OS que vous utilisez où la vitesse est concernée. Dans Windows, les processus sont coûteux, donc les threads seraient mieux dans les fenêtres, mais dans les processus unix sont plus rapides que leurs variantes Windows, l'utilisation des processus dans unix est beaucoup plus sûre et plus rapide à générer.


24
2018-06-15 11:22



D'autres réponses se sont concentrées plus sur l'aspect multithreading vs multitraitement, mais dans python Global Interpreter Lock (GIL) doit être pris en compte. Quand plus de nombre (disons k) de threads sont créés, généralement ils n'augmenteront pas la performance par  k  fois, car il fonctionnera toujours en tant qu'application à un seul thread. GIL est un verrou global qui verrouille tout et n'autorise qu'une seule exécution de thread utilisant un seul cœur. La performance augmente dans les endroits où des extensions C comme numpy, Network, E / S sont utilisées, où beaucoup de travail de fond est fait et GIL est libéré.
 Donc quand enfilage est utilisé, il n'y a qu'un seul thread au niveau du système d'exploitation alors que python crée des pseudo-threads qui sont complètement gérés par threading mais qui fonctionnent essentiellement comme un seul processus. La préemption a lieu entre ces pseudo-threads. Si la capacité de la CPU est maximale, vous pouvez passer en multitraitement.
Maintenant, dans le cas d'instances d'exécution autonomes, vous pouvez opter pour le pool. Mais en cas de chevauchement des données, lorsque vous souhaitez que les processus communiquent, vous devez utiliser multiprocessing.Process.


10
2018-06-02 06:46



Processus peut avoir plusieurs Thread ce thread peut partager la mémoire. Si vous considérez le Multiple Processus vs Multiple threads, Threads d'ailleurs dans le processus. processus est en cours d'exécution sur le processeur. les threads résident donc sous les processus. Les processus sont des entités individuelles qui s'exécutent indépendamment. Si vous voulez partager des données ou un état entre les processus, vous pouvez utiliser l'endroit commun où stocker les données (Ex. Cache (redis, memcache), Fichiers, Base de données)


0
2017-09-18 07:49