Heim >Backend-Entwicklung >Python-Tutorial >Die Todeszelle der GIL: Parallelitätsgrenzen durchbrechen und Python befreien
Python ist ein Schutzmechanismus, der verhindert, dass mehrere Threads gleichzeitig Bytecode ausführen. Es stellt zwar die Threading-SicherheitSicherheitdes Python-Interpreters sicher, geschieht dies jedoch auf Kosten der Parallelität, insbesondere bei CPU-intensiven Aufgaben.
Um GIL-Beschränkungen zu umgehen, haben Sie mehrere Möglichkeiten:
Multi-Threading ermöglicht die Erstellung paralleler Threads innerhalb eines einzelnen Python-Prozesses. Obwohl die GIL immer noch verhindert, dass Threads gleichzeitig Python-Bytecode ausführen, können sie I/O-Vorgänge ausführen, C-Erweiterungen ausführen oder nativen Code gleichzeitig ausführen.
Demo-Code:
import threading def io_bound_task(): with open("large_file.txt", "r") as f: data = f.read() def cpu_bound_task(): for i in range(1000000): i * i threads = [] threads.append(threading.Thread(target=io_bound_task)) threads.append(threading.Thread(target=cpu_bound_task)) for thread in threads: thread.start() for thread in threads: thread.join()
In diesem Beispiel ist io_bound_task
是 I/O 密集型的,cpu_bound_task
CPU-intensiv. Da die GIL E/A-Vorgänge nicht blockiert, können zwei Threads gleichzeitig ausgeführt werden.
Im Gegensatz zu Threads sind Prozesse gleichzeitige Einheiten auf Betriebssystemebene. Sie verfügen über eigenen Speicherplatz und Betriebssystemressourcen und sind daher nicht durch die GIL eingeschränkt.
Demo-Code:
import multiprocessing def cpu_bound_task(n): for i in range(1000000): i * i if __name__ == "__main__": processes = [] for i in range(4): processes.append(multiprocessing.Process(target=cpu_bound_task, args=(i,))) for process in processes: process.start() for process in processes: process.join()In diesem Beispiel haben wir 4 Prozesse erstellt, von denen jeder eine CPU-intensive Aufgabe ausführt. Da die GIL auf einen einzelnen Prozess beschränkt ist, können diese Aufgaben parallel ausgeführt werden.
Asynchrone
Demo-Code:
import asyncio async def io_bound_task(): reader, writer = await asyncio.open_connection("example.com", 80) writer.write(b"GET / Http/1.1 ") data = await reader.read(1024) print(data.decode()) async def main(): await asyncio.gather(io_bound_task(), io_bound_task()) asyncio.run(main())In diesem Beispiel verwenden wir die Asyncio-Bibliothek, um zwei E/A-intensive Aufgaben auszuführen. Da Asyncio eine Ereignisschleife verwendet, können diese Aufgaben gleichzeitig ausgeführt werden, auch wenn sie über GIL-Sperren verfügen.
Fazit
Das obige ist der detaillierte Inhalt vonDie Todeszelle der GIL: Parallelitätsgrenzen durchbrechen und Python befreien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!