Wat is een Python GIL?

Wat is een Python GIL?


Als je hebt gewerkt met Python en wilt beginnen te experimenteren met meer geavanceerde programmeertechnieken, leren over de wereldwijde tolk slot (GIL) is een goed idee. GIL is een algoritme dat de uitvoering van meerdere threads in een Python programma verwerkt. GIL is een vereiste als je werkt met meerdere threads omdat CPython's memory management is niet thread-safe. Daarnaast is de GIL is bekend dat een programma prestaties degraderen. Een voorbeeld is dat het langer twee slagen kan nemen om dezelfde functie aan te roepen dan één thread aanroepen tweemaal de functie.

Met behulp van GIL

In een multi-threaded Python programma kan een thread niet veilig toegang Python-objecten, tenzij de GIL is in handen van de huidige thread. De GIL zorgt ervoor dat beide draden juist zijn het actualiseren van de object referenties wordt genoemd. Om te beginnen met behulp van de GIL je nodig hebt om de draad staat op een locatie variabele opslaan en laat de wereldwijde tolk slot. Op dit moment kunt u het blokkeren van input / output bewerking uit te voeren en opnieuw op te pakken de wereldwijde tolk slot als het voltooid. Ten slotte, het herstel van de draad staat van de lokale variabele. U kunt de volgende macro voorbeeld gebruiken om het proces te vereenvoudigen:

Py_BEGIN_ALLOW_THREADS
... Doe wat het blokkeren van I / O-bewerking ...
Py_END_ALLOW_THREADS

Calling Python Code

Vaak draden worden gemaakt op basis van andere programmeertalen zoals C en als je nodig hebt om te bellen meerdere threads dan moet je GIL gebruiken. U moet eerst registreren deze draden met een tolk via een thread staat datastructuur en vervolgens verwerven van de GIL. Om dit proces kunt u de "PyGILState_Ensure ()" en "PyGILState_Release ()" functies te vereenvoudigen. Het volgende is een voorbeeld van hoe dit concept toe te passen:

PyGILState_STATE gstate;
gstate = PyGILState_Ensure ();
/ Perform Python acties hier. /
result = CallSomeFunction ();
/ Resultaat te evalueren of te behandelen uitzondering /
/ Laat de thread. Geen Python API toegestaan ​​voorbij dit punt. /
PyGILState_Release (gstate);

Python Threads

In Python een thread is een echt systeem draad als elk ander programma-uitvoering. Bij het uitvoeren van een thread Python creëert een klein datastructuur met de tolk staat. Na deze een nieuwe thread wordt gelanceerd en zij noemt de 'PyEval_CallObject. "De laatste stap is een eenvoudige C-functie die draait wat Python gespecificeerd. De GIL zorgvuldig controleert elke uitvoering thread. Het volgende is een voorbeeld van een Python thread:

import tijd
import threading
klasse CountdownThread (threading.Thread):
def init (zelf, count):
threading.Thread. init (zelf)
self.count = count
def run (zelf):
terwijl self.count> 0:
afdrukken "Counting down", self.count
self.count - = 1
time.sleep (5)
terugkeer

GIL Problemen en Vervanging

Python ontwikkelaars hebben de eliminatie van GIL besproken, maar hebben gelopen in een aantal uitdagingen. Een probleem vaak genoemd met GIL is dat het voorkomt dat multithreaded CPython programma's ten volle te profiteren van multi-core processors. Elke GIL vervanging moet eenvoudig en gelijktijdig zijn bij het werken met draden. Moet sneller dan GIL zijn en moet een goede API compatibiliteit te hebben. Een voorbeeld van de API compatibiliteit goede traceren wanneer opsommen van de objecten waarnaar het verwijst.