Kürzlich habe ich mich mit Multithreading in Python befasst, und wir hören oft von Veteranen sagen: „Multi- Threading in Python ist nutzlos, es wird empfohlen, Multiprozess zu verwenden!
Es liegt also folgende vertiefte Recherche vor: . Was ist GIL?
Der vollständige Name von GIL ist Global Interpreter Lock (Global Interpreter Lock). Die Quelle ist die Überlegung zu Beginn des Python-Designs , für getroffene Entscheidungen zur Datensicherheit.
2. Jede CPU kann nur einen Thread gleichzeitig ausführen
(Tatsächlich Multithreading unter einem einzigen -core CPU Beide sind nur Parallelität, nicht Parallelität. Aus makroökonomischer Sicht sind Parallelität und Parallelität beide Konzepte für die gleichzeitige Verarbeitung mehrerer Anforderungen. Es gibt jedoch einen Unterschied zwischen Parallelität und Parallelität Gleichzeitig bedeutet Parallelität, dass zwei oder mehr Ereignisse gleichzeitig auftreten. Unter Python-Multithreading ist die Ausführungsmethode jedes Threads:
1. Holen Sie sich GIL2, führen Sie den Code aus, bis er in den Ruhezustand wechselt oder die virtuelle Python-Maschine ihn anhält. 3. Geben Sie die GIL frei als „Pass“ und in einem Python-Prozess gibt es nur eine GIL. Threads, die keinen Pass erhalten können, dürfen die CPU nicht zur Ausführung betreten.
in Python2.x , Die Freigabelogik von GIL besteht darin, dass der aktuelle Thread auf eine E/A-Operation stößt oder die Anzahl der Ticks 100 erreicht (Ticks können als Zähler von Python selbst betrachtet werden, der speziell für GIL verwendet wird und nach jeder Veröffentlichung auf Null zurückgesetzt wird. Diese Anzahl kann sein angepasst durch sys.setcheckinterval ) zur Freigabe.
Jedes Mal, wenn die GIL-Sperre aufgehoben wird, Der Thread, der um Sperren konkurriert und Threads wechselt, verbraucht Ressourcen. Und aufgrund der GIL-Sperre kann ein Prozess in Python nur einen Thread gleichzeitig ausführen (der Thread, der die GIL erhalten hat, kann ausgeführt werden. Aus diesem Grund ist die Multithreading-Effizienz von Python auf Multi-Core-CPUs nicht hoch).
Ist Python also völlig nutzlos?
Hier haben wir eine geheime Diskussion:
1 .), in diesem Fall wird die Anzahl der Ticks aufgrund des hohen Rechenaufwands bald den Schwellenwert erreichen und dann die Freigabe und den erneuten Wettbewerb von GIL auslösen (das Hin- und Herwechseln zwischen mehreren Threads verbraucht sicherlich Ressourcen), also Multithreading unter Python ist für CPU-intensive Codes nicht geeignet.
2. IO-intensiver Code (Dateiverarbeitung, Webcrawler usw.), Multithreading kann die Effizienz effektiv verbessern (wenn IO-Vorgänge unter einem einzelnen Thread vorhanden sind, wartet IO, was zu unnötiger Zeitverschwendung führt und Multithreading aktivieren kann Durch den automatischen Wechsel zu Thread B werden keine CPU-Ressourcen verschwendet, wodurch die Effizienz der Programmausführung verbessert wird. Das Multithreading von Python ist also benutzerfreundlicher für E/A-intensiven Code.
Und in python3.x , GIL verwendet keine Tick-Zählung, sondern einen Timer (nachdem die Ausführungszeit den Schwellenwert erreicht hat, gibt der aktuelle Thread die GIL frei), was für CPU-intensive Programme benutzerfreundlicher ist, , aber immer noch nicht löst Das durch GIL verursachte Problem besteht darin, dass nur ein Thread ausgeführt werden kann, sodass die Effizienz immer noch unbefriedigend ist.
🎜>Bitte beachten Sie: Multi-Core-Multi-Threading ist schlechter als Single-Core-Multi-Threading Nach der Freigabe durch CPU0 kann der aufgeweckte Thread die GIL-Sperre erhalten, sodass er nahtlos ausgeführt werden kann. Nachdem CPU0 die GIL freigegeben hat, konkurrieren die Threads auf anderen CPUs, die GIL kann jedoch sofort von CPU0 abgerufen werden. Dies führt dazu, dass die aktivierten Threads auf mehreren anderen CPUs bis zur Umschaltzeit warten und dann in den Status „Ausstehend“ wechseln. Dies führt dazu, dass die Threads „Thrashing“ sind, was zu einer geringeren Effizienz führt 🎜 >Zurück zur ursprünglichen Frage: Wir hören oft Veteranen sagen:
„Wenn Sie Multi-Core-CPUs in Python voll ausnutzen möchten, verwenden Sie Multiprozess“ , was ist der Grund?
Der Grund ist: Jeder Prozess hat seine eigene unabhängige GIL Sie stören sich nicht gegenseitig, sodass sie im wahrsten Sinne des Wortes parallel ausgeführt werden können. Daher ist in Python die Ausführungseffizienz von Multiprozessen besser als die von Multithreads (nur für Multicore-CPUs).
Hier ist also die Schlussfolgerung: Wenn Sie unter Multi-Core eine parallele Verarbeitung durchführen möchten, um die Effizienz zu verbessern, ist die Verwendung von Multiprozess eine häufigere Methode. was die Ausführungseffizienz effektiv verbessern kann
[Verwandte Empfehlungen]
1. Multiprozess- und Multithread-Beispiele in Python (1)
2. Beispiele für Multiprozess und Multithreading in Python (2) Programmiermethoden
3. Ist Multiprozess oder Multithread in Python schneller?
4. Detaillierte Einführung in Python-Prozesse, Threads und Coroutinen
5. Python-Concurrent-Programming-Thread-Pool/Prozess-Pool
Das obige ist der detaillierte Inhalt vonWird empfohlen, in Python Multi-Processing anstelle von Multi-Threading zu verwenden? Teilen Sie die Gründe mit, warum die Verwendung von Multiprozessen empfohlen wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!