? Hvis du har arbejdet med Python og ønsker at begynde at eksperimentere med mere avancerede programmering teknikker , lære om global tolk lås ( GIL ) er en god idé. GIL er en algoritme , der håndterer udførelsen af flere tråde i et Python program. GIL er et krav , når du arbejder med flere tråde , fordi CPython hukommelse ledelsen ikke er thread- safe. Desuden har GIL været kendt for at nedbryde en programmer ydeevne . Et eksempel er, at det kan tage længere tid for to tråde til at kalde den samme funktion end én tråd kalder funktionen to gange . Brug GIL
I et multi -threaded Python -program en tråd kan ikke sikkert at få adgang Python objekter , medmindre GIL ejes af den aktuelle tråd. Den GIL sørger for, at begge tråde korrekt opdaterer objektreferencer bliver kaldt . At begynde at bruge GIL skal du gemme tråden stat i en placering variabel og slip den globale tolk lås. På dette punkt kan du udføre dit blokerende input /output drift og generhverve den globale tolk låsen, når den er færdig. Endelig genoprette tråden staten fra den lokale variabel. Du kan bruge følgende makro eksempel at forenkle processen :
Py_BEGIN_ALLOW_THREADS ... Har nogle blokerende I /O operation ... Py_END_ALLOW_THREADS
Calling Python Code
Ofte tråde oprettet fra andre programmeringssprog såsom C og hvis du har brug for at ringe flere tråde så er du nødt til at bruge GIL . Du skal først registrere disse tråde med en tolk via en tråd state datastruktur og derefter erhverve GIL . For at forenkle denne proces kan du bruge " PyGILState_Ensure () " og " PyGILState_Release () "-funktionerne . Det følgende er et eksempel på, hvordan man kan anvende dette koncept : Hej
PyGILState_STATE gstate , gstate = PyGILState_Ensure () ;/* Udfør Python handlinger her. * /result = CallSomeFunction () ;/* evaluere resultat eller håndterer undtagelsen * //* Slip tråd. Ingen Python API tilladt over dette punkt . * /PyGILState_Release ( gstate )
Python Tråde
Python en tråd er et virkeligt system tråden som ethvert andet program udførelse. Når du udfører en tråd Python skaber en lille datastruktur med tolken stat. Efter dette en ny tråd er lanceret , og det kalder " PyEval_CallObject . " Det sidste trin er en simpel C-funktion , der kører uanset Python angivet. Den GIL omhyggeligt kontrollerer hvert tråd udførelse. Det følgende er et eksempel på en Python tråd : Hej
import timeimport threadingclass CountdownThread ( threading.Thread ) : def __ init__ (selv , count) : threading.Thread.__init__ (selv-) self.count = countdef run ( self ) : mens self.count > 0: print " tælle ned" , self.countself.count - = 1time.sleep (5) retur
GIL Problemer og udskiftning
Python udviklere har diskuteret afskaffelse af GIL , men er løbet ind i nogle udfordringer . Et problem ofte nævnt med GIL er, at det forhindrer flertrådede CPython programmer drage fuld fordel af multi -core processorer . Enhver GIL udskiftning skal være enkel og samtidig når man arbejder med tråde. Skal være hurtigere end GIL og skal have en god API kompatibilitet. Et eksempel for API kompatibilitet er at have en god sporing , når der opremses de objekter den peger på .