? Hvis du har jobbet med Python og ønsker å begynne å eksperimentere med mer avanserte programmering teknikker , lære om global tolk lock ( GIL ) er en god idé. GIL er en algoritme som håndterer gjennomføring av flere tråder i et Python-program . GIL er et krav når du arbeider med flere tråder fordi CPython minne ledelsen er ikke trådsikre . I tillegg har GIL vært kjent for å degradere en programmer ytelse. Et eksempel er at det kan ta lengre tid for to tråder å kalle samme funksjon enn en tråd kaller funksjonen to ganger. Ved hjelp av GIL
I en multi -threaded Python program en tråd kan ikke trygg tilgang Python gjenstander med mindre GIL er holdt av den aktuelle tråden . Den GIL sørger for at begge trådene er riktig oppdatere objekt referanser blir kalt . For å begynne å bruke GIL du trenger å lagre tråden stat på et sted variabel og slipp den globale tolk lås. På dette punktet kan du utføre din blokkerer input /output drift og søke opp globale tolk lås når det er ferdig . Til slutt , gjenopprette tråden staten fra den lokale variabelen . Du kan bruke følgende makroeksempel å forenkle prosessen :
Py_BEGIN_ALLOW_THREADS ... Gjør noen blokkerer I /O operasjon ... Py_END_ALLOW_THREADS
Calling Python Code
Ofte tråder er opprettet fra andre programmeringsspråk som C , og hvis du må ringe flere tråder så må du bruke GIL . Du må først registrere disse trådene med en tolk gjennom en tråd tilstand datastruktur og deretter kjøpe GIL . For å forenkle denne prosessen kan du bruke " PyGILState_Ensure ( )" og " PyGILState_Release ( ) " funksjoner . Det følgende er et eksempel på hvordan du kan bruke dette konseptet : en
PyGILState_STATE gstate ; gstate = PyGILState_Ensure ( ) ;/* Utføre Python handlinger her . * /resultat = CallSomeFunction ( ) ;/* evaluere resultat eller håndtere unntak * //* Slipp tråden. Ingen Python API tillatt utover dette punktet . * /PyGILState_Release ( gstate ) ;
Python tråder
Python en tråd er et reelt system tråd som alle andre program gjennomføring . Når du utfører en tråd Python skaper en liten datastruktur med tolken tilstand. Etter dette en ny tråd er lansert , og det kaller " PyEval_CallObject . " Det siste trinnet er en enkel C -funksjon som kjører uansett Python spesifisert. Den GIL kontrollerer nøye hver tråden kjøring . Det følgende er et eksempel på en Python tråd : en
import timeimport threadingclass CountdownThread ( threading.Thread ) : def __ init__ (egen , teller) : threading.Thread.__init__ (egen ) self.count = countdef run (egen ) : mens self.count > 0 : print " Counting down" , self.countself.count - = 1time.sleep ( 5 ) retur
GIL Problemer og erstatning
Python utviklere har diskutert eliminering av GIL , men har kjørt inn noen utfordringer . Et problem som ofte nevnes med GIL er at det hindrer flertråders CPython programmer tar full nytte av multi - core prosessorer . Enhver GIL erstatning må være enkelt og samtidig når du arbeider med tråder . Må være raskere enn GIL og må ha en god API kompatibilitet. Et eksempel på API -kompatibilitet er å ha god sporing når opplisting objektene den peker til .