[Python] Fassen Sie die rudimentären Dinge über Multithreading zusammen

Python-Multithreading

In diesem Artikel werde ich zusammenfassen, was ich über Multithreading gelernt habe, und es beschreiben, um mein Verständnis zu vertiefen.

Über Multithreading

[Multithreading ist der parallele Ablauf mehrerer Prozesse bei der Ausführung eines einzelnen Computerprogramms. Auch solche Mehrfachverarbeitungsabläufe. ](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)

Wenn Sie das Programm in Threads unterteilen, können Sie diese parallel ausführen, während Sie den Speicherkontext gemeinsam nutzen. Wenn keine externen Ressourcen verwendet werden, erhöht sich die Geschwindigkeit auch dann nicht, wenn Multithreading auf einer Single-Core-CPU ausgeführt wird. Multithreading auf einer Mehrkern-CPU verbessert die Geschwindigkeit des Programms, indem jeder Thread einer separaten CPU zugewiesen und gleichzeitig parallel ausgeführt wird.

Vergleich von Threads und Prozessen

Die Funktionen werden unter dem Gesichtspunkt der einfachen Definition, des Speicherplatzes und des Kontextwechsels zusammengefasst.

Definition

Speicherplatz

Kontextwechsel

Informationen zu Kontextwechseln

[Ein Kontextwechsel dient dazu, den Prozessablauf (Prozess, Thread), der gerade vom Verarbeitungsgerät (CPU) des Computers ausgeführt wird, anzuhalten, zu einem anderen zu wechseln und die Ausführung fortzusetzen. ](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)

Der Kontextwechsel des Prozesses muss den Speicheradressraum wechseln, und diese Operation ist eine relativ teure Operation. Die folgenden Materialien waren hilfreich https://code-examples.net/ja/q/530280 https://www.slideshare.net/ssuserc2d4c1/ss-124497965

Infolgedessen gibt es unter dem Gesichtspunkt der Effizienz und Zuverlässigkeit jeweils die folgenden Merkmale.

Effizienz

Im Vergleich zur Parallelverarbeitung mit mehreren Prozessen ist Multithread effizienter, da es im Allgemeinen Speicherplatz gemeinsam nutzt.

Verlässlichkeit

Da sich Multithreading einen Speicherplatz teilt, ist es erforderlich, die Daten vor der Verarbeitung zu schützen, wenn bestimmte Daten aus der Parallelverarbeitung verwendet werden. Wenn mehrere Threads gleichzeitig versuchen, ungeschützte Daten zu aktualisieren, tritt ein Konflikt auf und ein unerwarteter Fehler tritt auf. Sie müssen es sperren, um Ihre Daten zu schützen. Es ist schwierig, es richtig zu verwenden, um Daten zu sperren.

Auf der anderen Seite teilen sich Multiprozesse keinen Speicherplatz, wodurch die Möglichkeit von Datenbeschädigungen und Deadlocks, die in Multithreads auftreten können, verringert wird.

Globale Interta-Sperre (GIL)

[Global Interpreter Lock (GIL) ist eine exklusive Sperre, die verhindert, dass der nicht threadsichere Code des Interpreter-Threads der Programmiersprache mit anderen Threads geteilt wird. ](Https://ja.wikipedia.org/wiki/Global Interta Lock)

Die in Ruby und Python vorhandene globale Interpretersperre (im Folgenden als "GIL" abgekürzt) wird übernommen. In Python ist die Anzahl der Threads, die auf Python-Objekte zugreifen, immer auf eins beschränkt. Warum ist das? Erstens ist die Implementierung von Python in C (CPython) nicht threadsicher. Die Situation, in der es nicht threadsicher ist, bezieht sich auf die Situation, in der die Daten beschädigt werden, wenn mehrere Threads gleichzeitig ausgeführt werden oder dieselben Daten verarbeiten. Bei den hier genannten Daten handelt es sich beispielsweise um "den Inhalt des gemeinsam genutzten Speicherbereichs". Um eine Datenbeschädigung zu vermeiden, die dadurch verursacht wird, dass sie nicht threadsicher ist, gibt es eine Möglichkeit, die gemeinsame Nutzung mit anderen Threads zu verhindern. Um die Freigabe für andere Threads zu verhindern, muss ein exklusiver Sperrmechanismus verwendet werden. Diese exklusive Sperre heißt GIL. Daher begrenzt GIL die Anzahl der Threads immer auf eins.

Die folgenden Materialien waren sehr hilfreich http://blog.bonprosoft.com/1632 https://methane.hatenablog.jp/entry/20111203/1322900647

Über GIL Python Official Document Erwähnen

Es gibt zwei Möglichkeiten, Python auf einem Computer mit mehreren CPUs zu beherrschen:

Verwendung von Multithreading mit GIL-Einschränkungen

Szenen, in denen Sie eine reaktionsschnelle Oberfläche erstellen möchten

Stellen Sie sich ein System vor, das Dateien per GUI-Vorgang von einem Verzeichnis in ein anderes kopiert. Multithreading wird als Voraussetzung verwendet, die Kopierverarbeitung wird im Hintergrund ausgeführt und das GUI-Fenster wird vom Hauptthread ständig aktualisiert. Infolgedessen wird der Fortschritt der Ausführung oder des Betriebs in Echtzeit an den Benutzer zurückgemeldet, und die Arbeit kann unterbrochen werden. Das Erstellen einer Schnittstelle basierend auf der Reaktionsfähigkeit bedeutet hier, zeitaufwändige Aufgaben im Hintergrund zu bearbeiten und innerhalb eines bestimmten Zeitraums Feedback an den Benutzer zurückzugeben. Es gibt die Verwendung von Multithreading als Methode, um dies zu realisieren. (Nicht zum Zweck der Leistungsverbesserung, sondern um dem Benutzer die Bedienung der Benutzeroberfläche zu ermöglichen, selbst wenn die Datenverarbeitung einige Zeit in Anspruch nimmt.)

Wenn ein Prozess von externen Ressourcen abhängt

Wenn der Prozess von externen Ressourcen abhängt, kann er möglicherweise durch Multithreading beschleunigt werden. Beim Senden einer großen Anzahl von HTTP-Anforderungen an einen externen Dienst wird häufig Multithreading verwendet. Es dauert einige Zeit, bis die Antwort empfangen wird. Wenn Sie mehrere Ergebnisse von der Web-API erhalten möchten, dauert es einige Zeit, bis sie synchron ausgeführt werden. Bei der Kommunikation mit WebAPI werden parallele Anforderungen (Anforderungen, bei denen mehrere Anforderungen ganz oder teilweise außer Betrieb ausgeführt werden können) parallel verarbeitet, ohne dass dies Auswirkungen auf die Antwortzeit hat. Es gibt. Um diese parallele Verarbeitung zu realisieren, können mehrere Anforderungen separat als Threads ausgeführt werden. Beim Ausführen einer HTTP-Anforderung dauert das Lesen vom TCP-Socket (recv ()) häufig einige Zeit. In CPython wird durch Ausführen der Funktion "recv ()" in der Sprache C GIL freigegeben. (Dies scheint auf das Blockieren der E / A-Verarbeitung zurückzuführen zu sein, aber ich verstehe es immer noch nicht.) Multithreading kann durch Loslassen von GIL verwendet werden.

Impressionen

Ich frage mich, ob Threads nützlich sind, um auf die E / A-Verarbeitung in Python zu warten. CPython ist für mich immer noch schwierig.

Verweise

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] Fassen Sie die rudimentären Dinge über Multithreading zusammen
Über das Python-Modul venv
Über die Aufzählungsfunktion (Python)
Über die Funktionen von Python
[Python] Was ist @? (Über Dekorateure)
Informationen zur Grundlagenliste der Python-Grundlagen
[Python Kivy] Über das Ändern des Designthemas
Informationen zur virtuellen Umgebung von Python Version 3.7
Python Amateur versucht die Liste zusammenzufassen ①
Fassen wir den Python-Codierungsstandard PEP8 (2) zusammen.
Über Python-Slices
Über den Test
Über die Python-Ausbeute
Ein Java-Programmierer studierte Python. (Über Dekorateure)
Über Python, Klasse
Über den Unterschied zwischen "==" und "is" in Python
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
Über Python, range ()
Über Python Decorator
Ein Memorandum über die Python-Tesseract-Wrapper-Bibliothek
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
Python Amateur versucht die Liste zusammenzufassen ②
Informationen zur Python-Referenz
Über Python-Dekorateure
[Python] Über Multi-Prozess
[Python] Denken Sie ernsthaft über die M-1-Gewinnmethode nach.
Über die Warteschlange
Fassen Sie den Python-Import zusammen
Überlegen Sie, wie Sie Python auf Ihrem iPad programmieren können
In Python sortieren. Lassen Sie uns als nächstes über den Algorithmus nachdenken.
Erhalten Sie das Formular in Python und führen Sie verschiedene Aktionen aus
[AWS IoT] Registrieren Sie Dinge in AWS IoT mithilfe des AWS IoT Python SDK
(◎◎) {Lass Python die langweiligen Dinge machen) ......... (Hey? Lass uns Python die Hausaufgaben machen} (゜) (゜)
Informationen zur Option --enable-shared beim Erstellen von Python unter Linux
Ein Memorandum über die Umsetzung von Empfehlungen in Python
Python-Memo (für mich): Über die Entwicklungsumgebung virtualenv
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Über Python für Schleife
Finden Sie das maximale Python
Über Funktionsargumente (Python)
[Python] Memo über Funktionen
Zusammenfassung über Python3 + OpenCV3
der Zen von Python
Über Python für ~ (Bereich)
[Python] Memo Über Fehler
Informationen zur Python-Entwicklungsumgebung
Informationen zur Entfaltungsfunktion
Python: Über Funktionsargumente
Über den Servicebefehl
Python, über die Ausnahmebehandlung
Über Python Pyramid Traversal
[Python] Teilen Sie das Datum
Über die Verwirrungsmatrix
Über das Besuchermuster
Über Python3 ... (Ellipsenobjekt)