Hva er en Python GIL?

Hva er en Python GIL?


Hvis du har vært å jobbe med Python og ønsker å begynne å eksperimentere med mer avanserte programmeringsteknikker, lære om global tolk lock (GIL) er en god idé. GIL er en algoritme som håndterer gjennomføringen av flere tråder i et Python-program. GIL er et krav når du arbeider med flere tråder fordi CPython minne ledelse er ikke thread-safe. I tillegg har GIL vært kjent for å degradere et program ytelse. Et eksempel er at det kan ta lengre tid for to tråder å ringe samme funksjon enn én tråd kaller funksjonen to ganger.

Ved hjelp av GIL

I en multi-threaded Python program en tråd kan ikke trygt tilgang Python gjenstander med mindre GIL holdes av gjeldende tråd. Den GIL sørger for at begge trådene er skikkelig oppdatering av objektreferanser blir kalt. For å begynne å bruke GIL du trenger å lagre tråden tilstand på et sted variabel og slipp den globale tolk låsen. 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. Endelig gjenopprette tråden staten fra den lokale variabelen. Du kan bruke følgende makro eksempel for å forenkle prosessen:

Py_BEGIN_ALLOW_THREADS
... Har noen blokkerer I / O-operasjon ...
Py_END_ALLOW_THREADS

Ringe Python-kode

Ofte tråder er opprettet fra andre programmeringsspråk som C, og hvis du trenger å ringe flere tråder så må du bruke GIL. Du må først registrere disse trådene med en tolk gjennom en tråd statlige datastruktur og deretter erverve GIL. For å forenkle denne prosessen kan du bruke "PyGILState_Ensure ()" og "PyGILState_Release ()" funksjoner. Følgende er et eksempel på hvordan du kan bruke dette konseptet:

PyGILState_STATE gstate;
gstate = PyGILState_Ensure ();
/ Utfør Python handlinger her. /
Resultatet = CallSomeFunction ();
/ Evaluere resultat eller håndtere unntak /
/ Slipp tråden. Ingen Python API tillatt utover dette punktet. /
PyGILState_Release (gstate);

Python tråder

I Python en tråd er en ekte systemtråd som alle andre programkjøring. Når du utfører en tråd Python skaper en liten datastruktur med tolken staten. Etter dette en ny tråd er lansert, og det kaller "PyEval_CallObject." Det siste trinnet er en enkel C funksjon som virker uansett Python spesifisert. Den GIL kontrollerer nøye hver tråd utførelse. Følgende er et eksempel på en Python tråden:

import tid
import threading
klasse CountdownThread (threading.Thread):
def init (selv, teller):
threading.Thread. init (egen-)
self.count = count
def kjøre (selv):
mens self.count> 0:
skrive "Teller ned", self.count
self.count - = 1
time.sleep (5)
komme tilbake

GIL problemer og erstatning

Python utviklere har diskutert eliminering av GIL, men har kjørt inn i noen utfordringer. Et problem som ofte nevnes med GIL er at det hindrer flertrådede CPython programmer tar full nytte av multi-core prosessorer. Enhver GIL erstatning må være enkel og samtidig når du arbeider med tråder. Må være raskere enn GIL og må ha en god API kompatibilitet. Et eksempel for API-kompatibilitet er å ha god sporing når opplisting objektene den peker til.