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.
[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.
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.
[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é.
Comparé au traitement parallèle par multi-processus, le multi-thread est plus efficace car il partage généralement l'espace mémoire.
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.
[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
Il existe deux façons de maîtriser Python sur une machine multi-CPU:
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)
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.
Je me demande si les threads sont utiles pour attendre le traitement des E / S en Python. CPython est encore difficile pour moi.
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