Maison  >  Article  >  développement back-end  >  Est-il recommandé d'utiliser le multi-traitement au lieu du multi-threading en Python ? Partagez les raisons pour lesquelles il est recommandé d'utiliser le multi-processus

Est-il recommandé d'utiliser le multi-traitement au lieu du multi-threading en Python ? Partagez les raisons pour lesquelles il est recommandé d'utiliser le multi-processus

零下一度
零下一度original
2017-06-01 10:03:581537parcourir

Récemment, je me suis intéressé au multi-threading en Python, et nous entendons souvent des vétérans dire : « Multi- le threading en Python ne sert à rien, il est recommandé d'utiliser le multi-processus », mais pourquoi dites-vous cela ?​                                                                                            Il y a donc les recherches approfondies suivantes :                          Tout d’abord, soulignez le contexte :                                                                                                                                                           

Le nom complet de GIL est Global Interpreter Lock (verrouillage global de l'interprète). La source est la considération au début de la conception de Python. , pour les décisions prises en matière de sécurité des données.

2. Chaque CPU ne peut exécuter qu'un seul thread à la fois
(En fait, le multi-threading sous un seul -core CPU Les deux ne sont que de la concurrence, pas du parallélisme. D'un point de vue macro, la concurrence et le parallélisme sont tous deux des concepts de traitement simultané de plusieurs requêtes, mais il existe une différence entre la concurrence et le parallélisme, ce qui signifie que deux événements ou plus se produisent simultanément. en même temps ; la concurrence signifie que deux événements ou plus se produisent en même temps)
Sous Python multi-thread, la méthode d'exécution de chaque thread : 1. Obtenez GIL2 , exécutez le code jusqu'à ce qu'il soit mis en veille ou que la machine virtuelle Python le suspende. 3. Libérez le GIL                                                                         🎜>On peut voir que si un thread veut s'exécuter, il doit d'abord obtenir le GIL. On peut penser au GIL. comme "pass", et dans un processus python, il n'y a que un GIL. Les threads qui ne peuvent pas obtenir de passe ne sont pas autorisés à entrer dans le CPU pour exécution.  
 
en Python2.x , la logique de publication de GIL est que le thread actuel rencontre une opération d'E/S ou que le nombre de ticks atteint 100 (les ticks peuvent être considérés comme un compteur de Python lui-même, spécialement utilisé pour GIL, et est réinitialisé à zéro après chaque version. Ce nombre peut être ajusté via sys.setcheckinterval ) pour être publié.​

 


Chaque fois que le verrou GIL est libéré, le thread En concurrence pour les verrous et le changement de thread consommera des ressources. Et à cause du verrou GIL, un processus en Python ne peut exécuter qu'un seul thread à la fois (le thread qui a obtenu le GIL peut s'exécuter). C'est pourquoi l'efficacité multithread de Python n'est pas élevée sur les processeurs multicœurs.

                                       Alors, c'est du python ? Le multithreading est-il complètement inutile ?
 
Nous avons ici une discussion classifiée :         
1. Code gourmand en CPU (divers traitements de boucles, comptage, etc.) .), dans ce cas, en raison du gros travail de calcul, le nombre de ticks atteindra bientôt le seuil, et déclenchera alors la libération et la re-compétition de GIL (le basculement entre plusieurs threads consomme certainement des ressources), donc Le multi-threading sous Python n'est pas compatible avec les codes gourmands en CPU.

2. 🎜>Traitement de fichiers, robots d'exploration Web, etc.), le multithreading peut améliorer efficacement l'efficacité (s'il y a des opérations d'E/S sous un seul thread, l'E/S attendra, provoquant une perte de temps inutile, et l'activation du multithread peut Le passage automatique au thread B ne gaspillera pas les ressources du processeur, améliorant ainsi l'efficacité de l'exécution du programme). Le multithreading de Python est donc plus convivial pour le code gourmand en E/S.  


Et en python3.x , GIL n'utilise pas le comptage de ticks, mais utilise une minuterie (une fois que le temps d'exécution atteint le seuil, le thread actuel libère le GIL), ce qui est plus convivial pour les programmes gourmands en CPU, mais ne résout toujours pas le problème du même temps causé par GIL Le problème est qu'un seul thread peut être exécuté, donc l'efficacité n'est toujours pas satisfaisante.                                            🎜>Remarque : le multithreading multicœur est pire que le multithreading monocœur. La raison en est que dans le cas du multithreading monocœur, chaque fois que le GIL est exécuté. libéré, le thread qui se réveille peut obtenir le verrou GIL, il peut donc être exécuté de manière transparente. Cependant, en multicœur, après que CPU0 ait libéré le GIL, les threads sur d'autres CPU seront en compétition, mais le GIL peut être obtenu par CPU0 immédiatement. ce qui oblige les threads réveillés sur plusieurs autres processeurs à attendre l'heure de commutation, puis à entrer dans l'état à planifier. Cela entraînera un thrashing du thread, ce qui entraînera une efficacité moindre
.                      🎜 >Retour à la question initiale : nous entendons souvent les vétérans dire :
"Si vous souhaitez utiliser pleinement les processeurs multicœurs en python, utilisez le multi-processus" , quelle est la raison ?​ La raison est la suivante : chaque processus a son propre GIL indépendant , n'interfèrent pas les uns avec les autres, afin qu'ils puissent être exécutés en parallèle dans le vrai sens du terme, donc en python, l'efficacité d'exécution du multi-processus est meilleure que celle du multi-thread (uniquement pour les CPU multicœurs).                                                                    Voici donc la conclusion : sous multicœur, si vous souhaitez effectuer un traitement parallèle pour améliorer l'efficacité, une méthode plus courante consiste à utiliser le multi-processus, ce qui peut améliorer efficacement l'efficacité de l'exécution

[Recommandations associées]

1. Exemples multi-processus et multi-thread en Python (1)

2. Exemples de multi-processus et multi-threading en Python (2) Méthodes de programmation

3 Le multi-processus ou le multi-thread est-il plus rapide en python ?

4. Introduction détaillée aux processus, threads et coroutines Python

5 Pool de threads/pool de processus de programmation simultanée <.>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn