? Om du har arbetat med Python och vill börja experimentera med mer avancerade programmering tekniker , lära sig om globala tolk lås ( GIL ) är en bra idé . GIL är en algoritm som hanterar genomförandet av flera trådar i ett Python -program . GIL är ett krav när du arbetar med flera trådar eftersom CPython minne management är inte trådsäker . Dessutom har den GIL varit kända för att försämra en program prestanda. Ett exempel är att det kan ta längre tid för två trådar för att ringa samma funktion än en tråd att anropa funktionen två gånger. Använda GIL
I en multi - trådad Python -program en tråd kan inte säkert komma Python objekt såvida GIL innehas av den aktuella tråden . Den GIL ser till att båda trådarna är korrekt uppdatering av objekt referenser som anropas. För att börja använda GIL du behöver spara tråden staten i ett läge variabel och släpp den globala tolk låset . På denna punkt kan du utföra ditt blockerande input /output funktion och återfå den globala tolk låset när den är klar . Slutligen återställa tråden tillståndet från den lokala variabeln . Du kan använda följande makro exempel att förenkla processen :
Py_BEGIN_ALLOW_THREADS ... Gör några blockerande I /O-operation ... Py_END_ALLOW_THREADS Addera Calling Python kod
Ofta trådar skapas från andra programmeringsspråk såsom C och om du behöver ringa flera trådar då du behöver använda GIL . Du måste först registrera dessa trådar med en tolk via en tråd tillstånd datastruktur och sedan förvärva GIL . För att förenkla denna process kan du använda " PyGILState_Ensure ( ) " och " PyGILState_Release ( ) " -funktioner . Följande är ett exempel på hur man kan tillämpa detta begrepp :
PyGILState_STATE gstate , gstate = PyGILState_Ensure ( ) ;/* Utföra Python åtgärder här . * /resultat = CallSomeFunction ( ) ;/* utvärdera resultatet eller hantera undantag * //* Släpp tråden . Ingen Python API tillåtet bortom denna punkt . * /PyGILState_Release ( gstate ) ,
Python Threads
Python en tråd är ett verkligt system tråd som alla andra program körs. När du utför en tråd Python skapar en liten datastruktur med tolken staten . Efter detta en ny tråd lanseras och det kallar " PyEval_CallObject . " Det sista steget är en enkel C-funktion som körs oavsett Python specificeras . Den GIL kontrollerar noggrant varje tråd utförande . Följande är ett exempel på en Python tråd :
import timeimport threadingclass CountdownThread ( threading.Thread ) : def __ init__ (själv , räkna ) : threading.Thread.__init__ (egen ) self.count = countdef run (själv ) : medan self.count > 0 : print " Räkna ner " , self.countself.count - = 1time.sleep ( 5 ) tur
GIL Problem och ersätter
Python -utvecklare har diskuterat avskaffandet av GIL men har stött på en del utmaningar . Ett problem som ofta nämns med GIL är att det förhindrar flertrådade CPython program från att dra full nytta av multi - core processorer . Varje GIL ersättare måste vara enkelt och samtidigt när du arbetar med gängor . Måste vara snabbare än GIL och måste ha en bra API kompatibilitet . Ett exempel på API-kompatibilitet är att ha bra spårning när räkna föremålen den pekar på . Addera