In diesem Artikel werde ich zusammenfassen, was ich über Multithreading gelernt habe, und es beschreiben, um mein Verständnis zu vertiefen.
[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.
Die Funktionen werden unter dem Gesichtspunkt der einfachen Definition, des Speicherplatzes und des Kontextwechsels zusammengefasst.
[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.
Im Vergleich zur Parallelverarbeitung mit mehreren Prozessen ist Multithread effizienter, da es im Allgemeinen Speicherplatz gemeinsam nutzt.
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.
[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
Es gibt zwei Möglichkeiten, Python auf einem Computer mit mehreren CPUs zu beherrschen:
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 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.
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.
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