Als u hebt gewerkt met Python en wilt beginnen te experimenteren met meer geavanceerde programmeertechnieken , het leren over mondiale tolk lock ( GIL ) is een goed idee . GIL is een algoritme dat de uitvoering van meerdere threads in een Python programma behandelt . GIL is een vereiste als je werkt met meerdere threads omdat CPython 's memory management is niet thread - safe . Bovendien is het GIL bekend dat een programma prestaties dalen . Een voorbeeld is dat het langer kan duren voor twee threads dezelfde functie dan een draad twee keer aanroepen van de functie aan te roepen . Met behulp van GIL In een multi - threaded Python programma een thread niet veilig Python objecten openen , tenzij de GIL is in handen van de huidige thread . De GIL zorgt ervoor dat beide draden goed zijn het object referenties worden genoemd updaten . Om gebruik te maken van de GIL je nodig hebt om de draad staat te slaan op een locatie variabele en laat de wereldwijde tolk slot . Op dit punt kunt u uw blokkeren input /output bewerking uit te voeren en weer terug te krijgen van de wereldwijde tolk -vergrendeling wanneer het voltooid is . 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 blokkerende I /O-bewerking ... Py_END_ALLOW_THREADS Calling Python Code Vaak draden worden gemaakt van andere programmeertalen zoals C en als u meerdere bellen threads dan moet je GIL gebruiken . U moet eerst aan te melden deze draden met een tolk via een draad staat datastructuur en het verwerven van de GIL daarna . Om dit proces te vereenvoudigen kunt u de " PyGILState_Ensure ( ) " en " PyGILState_Release ( ) " functie gebruiken . Het volgende is een voorbeeld van hoe dit concept toe te passen : PyGILState_STATE gstate ; gstate = PyGILState_Ensure ( ) ;/* Voer Python acties hier . * /resultaat = CallSomeFunction ( ) ;/* resultaat te evalueren of een handgreep uitzondering * //* Laat de draad . Geen Python API toegestaan voorbij dit punt . * /PyGILState_Release ( gstate ) ; Python discussies In Python een thread is een echt systeem thread als elk ander programma-uitvoering . Bij het uitvoeren van een thread Python creëert een kleine gegevensstructuur met de tolk staat . Na dit een nieuwe thread wordt gestart en zij noemt de ' PyEval_CallObject . " De laatste stap is een eenvoudige C functie die loopt wat Python opgegeven . De GIL controleert zorgvuldig elke draad uitvoering. Het volgende is een voorbeeld van een Python thread : import timeimport threadingclass CountdownThread ( threading.Thread ) : def __ init__ (zelf , count ) : threading.Thread.__init__ (zelf ) self.count = countdef run (zelf ) : terwijl self.count > 0 : print " Counting down" , self.countself.count - = 1time.sleep ( 5 ) return GIL Problemen en vervanging Python ontwikkelaars hebben de eliminatie van GIL besproken maar hebben lopen in sommige uitdagingen . Een probleem vaak genoemd met GIL is dat het voorkomt dat multithreaded CPython programma's van het optimaal gebruik maken van multi - core processors . Elke GIL vervanging moet eenvoudig en gelijktijdig zijn bij het werken met draden . Moet sneller dan GIL en moet een goede API compatibiliteit hebben . Een voorbeeld voor de API compatibiliteit is goed om te hebben traceren bij het opsommen van de objecten waarnaar het verwijst .
|