Wir alle sind uns der Schrecken der GIL bewusst, und ich habe eine Menge Diskussionen über das Thema gesehen richtige Zeit, um das multiprocessing
Modul zu verwenden, aber ich habe immer noch nicht das Gefühl, dass ich eine gute Intuition darüber habe, wenn Threading in Python (hauptsächlich mit CPython) die richtige Antwort ist.
In welchen Fällen ist die GIL kein bedeutender Engpass? Was sind die Arten von Anwendungsfällen, in denen Threading am besten geeignet ist?
Threading macht wirklich nur Sinn, wenn Sie eine Menge blockierender I / O haben. Wenn das der Fall ist, können einige Threads schlafen, während andere Threads arbeiten. Wenn Threads CPU-gebunden sind, werden Sie vom Multithreading wahrscheinlich nicht viel profitieren.
Beachten Sie, dass das Modul Multiprocessing , obwohl es schwieriger zu codieren ist, separate Prozesse verwendet und daher nicht funktioniert Die Nachteile der GIL leiden nicht.
Da Sie nach Beispielen zu suchen scheinen, sind hier einige von meinem Kopf und ich habe mich auf die Suche nach CPU-gebundenen und I / O-gebundenen Beispielen gemacht (ich kann nicht viele finden). Ich bin kein Experte, also zögern Sie nicht, etwas zu korrigieren, das ich falsch kategorisiert habe. Es ist auch erwähnenswert, dass fortschreitende Technologie ein Problem von einer Kategorie in eine andere verschieben kann.
multiprocessing
) threading
ist wahrscheinlich in Ordnung) Die GIL verhindert, dass python mehrere Threads ausführt.
Wenn Ihr Code die GIL vor dem Sprung in eine C-Erweiterung freigibt, können andere Python-Threads weiterlaufen, während der C-Code ausgeführt wird. Wie bei der blockierenden IO, die andere Leute erwähnt haben.
Ctypes macht das automatisch und tut auch numpy . Wenn Ihr Code sie also sehr oft verwendet, kann es durch die GIL nicht wesentlich eingeschränkt werden.
Neben den CPU-gebundenen und E / A-gebundenen Tasks gibt es noch weitere Anwendungsfälle. Zum Beispiel aktiviert thread gleichzeitige Aufgaben . Eine Menge GUI-Programmierung fällt in diese Kategorie. Die Hauptschleife muss auf Mausereignisse reagieren. Wenn Sie also eine Aufgabe haben, die eine Weile dauert und Sie die Benutzeroberfläche nicht einfrieren wollen, tun Sie dies in einem separaten Thread. Es geht weniger um Leistung als um Parallelität.
Tags und Links python multithreading gil