[Python] Résumez les éléments rudimentaires du multithreading

Multithreading Python

Dans cet article, je vais résumer ce que j'ai appris sur le multithreading et le décrire afin d'approfondir ma compréhension.

À propos du multithreading

[Le multithreading est le flux parallèle de plusieurs processus lors de l'exécution d'un seul programme informatique. En outre, ces multiples flux de traitement. ](Http://e-words.jp/w/%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B9%E3%83%AC%E3%83%83 % E3% 83% 89.html)

Si vous divisez le programme en threads, vous pouvez les exécuter en parallèle tout en partageant le contexte mémoire. Si les ressources externes ne sont pas utilisées, la vitesse n'augmentera pas même si le multithreading est effectué sur un processeur à un seul cœur. Le multi-threading sur un processeur multicœur améliore la vitesse du programme en affectant chaque thread à un processeur séparé et en l'exécutant en parallèle en même temps.

Comparaison des threads et des processus

Les fonctionnalités sont résumées du point de vue de la définition simple, de l'espace mémoire et du changement de contexte.

Définition

Espace mémoire

Changement de contexte

À propos des changements de contexte

[Un changement de contexte consiste à suspendre le flux de processus (processus, thread) en cours d'exécution par le périphérique de traitement de l'ordinateur (CPU), à passer à un autre et à reprendre l'exécution. ](Http://e-words.jp/w/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88 % E3% 82% B9% E3% 82% A4% E3% 83% 83% E3% 83% 81.html)

Le changement de contexte du processus doit changer l'espace d'adressage mémoire, et cette opération est une opération relativement coûteuse. Les matériaux suivants ont été utiles https://code-examples.net/ja/q/530280 https://www.slideshare.net/ssuserc2d4c1/ss-124497965

En conséquence, les caractéristiques suivantes existent pour chacun du point de vue de l'efficacité et de la fiabilité.

Efficacité

Comparé au traitement parallèle par multi-processus, le multi-thread est plus efficace car il partage généralement l'espace mémoire.

fiabilité

Comme le multithreading partage un espace mémoire, lorsque certaines données sont utilisées à partir d'un traitement parallèle, il est nécessaire de protéger les données du traitement accédé. Lorsque plusieurs threads tentent de mettre à jour une donnée non protégée en même temps, un conflit se produit et une erreur inattendue se produit. Vous devez le verrouiller pour protéger vos données. Il est difficile de l'utiliser correctement pour verrouiller les données.

D'autre part, étant donné que les multi-processus ne partagent pas l'espace mémoire, la possibilité de corruption des données et de blocage pouvant survenir dans les multi-threads est réduite.

Verrouillage mondial Interta (GIL)

[Global Interpreter Lock (GIL) est un verrou exclusif qui empêche le code non thread-safe détenu par le thread d'interprétation du langage de programmation d'être partagé avec d'autres threads. ](Https://ja.wikipedia.org/wiki/Global Interta Lock)

Le verrou d'interprétation global (ci-après abrégé en "GIL") qui existe dans Ruby et Python est adopté. En Python, le nombre de threads qui accèdent aux objets Python est toujours limité à un. Pourquoi est-ce? Premièrement, l'implémentation de Python écrite en C (CPython) n'est pas thread-safe. La situation dans laquelle il n'est pas thread-safe fait référence à la situation dans laquelle les données sont endommagées lorsque plusieurs threads s'exécutent en même temps ou traitent les mêmes données. Les données mentionnées ici sont, par exemple, "le contenu de la zone de mémoire partagée". Afin d'éviter la corruption des données causée par la non-sécurité des threads, il existe un moyen d'empêcher le partage avec d'autres threads. Afin d'éviter le partage avec d'autres threads, il est nécessaire d'adopter un mécanisme de verrouillage exclusif. Cette serrure exclusive s'appelle GIL. Par conséquent, GIL limite toujours le nombre de threads à un.

Les matériaux suivants ont été très utiles http://blog.bonprosoft.com/1632 https://methane.hatenablog.jp/entry/20111203/1322900647

À propos de GIL Python Official Document Mention

Il existe deux façons de maîtriser Python sur une machine multi-CPU:

Utilisation du multithreading avec restrictions GIL

Scènes où vous souhaitez créer une interface réactive

Considérez un système qui copie des fichiers d'un répertoire à un autre par opération GUI. Le multithreading est utilisé comme condition requise, le traitement de la copie est exécuté en arrière-plan et la fenêtre de l'interface graphique est constamment mise à jour par le thread principal. En conséquence, la progression de l'exécution ou de l'opération est renvoyée à l'utilisateur en temps réel et le travail peut être interrompu. Créer une interface basée sur la réactivité signifie ici traiter des tâches chronophages en arrière-plan et renvoyer des commentaires à l'utilisateur dans un certain délai. Une façon d'y parvenir consiste à utiliser le multithreading. (Non pas dans le but d'améliorer les performances, mais pour permettre à l'utilisateur d'utiliser l'interface même lorsque le traitement des données prend du temps)

Lorsqu'un processus dépend de ressources externes

Si le processus dépend de ressources externes, il peut être possible d'accélérer par le multithreading. Lors de l'envoi d'un grand nombre de requêtes HTTP à un service externe, le multithreading est souvent utilisé. La réception de la réponse prend du temps. Si vous souhaitez obtenir plusieurs résultats de l'API Web, il faut du temps pour les exécuter de manière synchrone. Lors de la communication avec WebAPI, les requêtes parallèles (requêtes lorsque plusieurs requêtes peuvent être exécutées complètement ou partiellement dans le désordre) sont traitées en parallèle sans pratiquement aucun effet sur le temps de réponse. Il y a. Afin de réaliser ce traitement parallèle, plusieurs requêtes peuvent être exécutées séparément en tant que threads. Lors de l'exécution d'une requête HTTP, la lecture depuis le socket TCP (recv ()) prend souvent du temps. En CPython, l'exécution de la fonction recv () en langage C libère GIL. (Cela semble être dû au blocage du traitement des E / S, mais je ne comprends toujours pas.) Le multithreading peut être utilisé en libérant GIL.

Impressions

Je me demande si les threads sont utiles pour attendre le traitement des E / S en Python. CPython est encore difficile pour moi.

Les références

http://ossforum.jp/node/579 https://ja.wikipedia.org/wiki/グローバルインタプリタロック http://blog.bonprosoft.com/1632 https://methane.hatenablog.jp/entry/20111203/1322900647 http://e-words.jp/w/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81.html http://e-words.jp/w/%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89.html Mastering TCP / IP Primer 5th Edition Expert Python Programming Revised 2nd Edition

Recommended Posts

[Python] Résumez les éléments rudimentaires du multithreading
À propos du module Python venv
À propos de la fonction enumerate (python)
À propos des fonctionnalités de Python
[Python] Qu'est-ce que @? (À propos des décorateurs)
À propos de la liste de base des bases de Python
[Python Kivy] À propos de la modification du thème de conception
À propos de l'environnement virtuel de Python version 3.7
Python amateur tente de résumer la liste ①
Résumons le standard de codage Python PEP8 (2)
À propos des tranches Python
À propos du test
À propos du rendement Python
Un programmeur Java a étudié Python. (À propos des décorateurs)
À propos de python, classe
À propos de la différence entre "==" et "is" en python
Écrire une note sur la version python de python virtualenv
À propos de python, range ()
À propos de Python Decorator
Un mémorandum sur la bibliothèque de wrapper Python tesseract
[Note] À propos du rôle du trait de soulignement "_" en Python
amateur python tente de résumer la liste ②
À propos de la référence Python
À propos des décorateurs Python
[Python] À propos du multi-processus
[Python] Pensez sérieusement à la méthode gagnante M-1.
À propos de la file d'attente
Synthétiser l'importation Python
Réfléchissez à la programmation de Python sur votre iPad
Trier en Python. Pensons ensuite à l'algorithme.
Recevez le formulaire en Python et faites diverses choses
[AWS IoT] Enregistrer des éléments dans AWS IoT à l'aide du SDK AWS IoT Python
(◎◎) {Laissons Python faire les choses ennuyeuses) ......... (Hé? Laissons Python faire les devoirs} (゜) (゜)
À propos de l'option --enable-shared lors de la construction de Python sous Linux
Un mémorandum sur la mise en œuvre des recommandations en Python
mémo python (pour moi-même): À propos de l'environnement de développement virtualenv
J'ai essayé de résumer les opérations de chaîne de Python
À propos de Python for loop
Trouvez le maximum de Python
À propos des arguments de fonction (python)
[Python] Mémo sur les fonctions
Résumé sur Python3 + OpenCV3
le zen de Python
À propos de Python, pour ~ (plage)
[Python] Mémo sur les erreurs
À propos de l'environnement de développement Python
À propos de la fonction Déplier
Python: à propos des arguments de fonction
À propos de la commande de service
Python, à propos de la gestion des exceptions
À propos de Python Pyramid Traversal
[Python] Fractionner la date
À propos de la matrice de confusion
À propos du modèle de visiteur
À propos de Python3 ... (objet Ellipsis)