Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky

Domáce Hardware Siete Programovanie Softvér Otázka Systémy

Čo je Python GIL

? Ak ste pracovali s Python a chcete začať experimentovať s viac pokročilých programovacích techník , učenie o globálnom tlmočníka zámku ( GIL ) , je to dobrý nápad . GIL je algoritmus , ktorý sa stará o beh viacerých vlákien v programe Python . GIL je požiadavka , keď pracujete s viacerými závitmi , pretože správa pamäte CPython nie je thread - safe . Okrem toho , GIL je známe, že k degradácii výkonnosti programov . Jedným z príkladov je , že to môže trvať dlhšie , než dva závity volať rovnakú funkciu ako jedno vlákno volá dvakrát funkciu . Použitie GIL

multi - Threaded Python programu vlákno nemôže bezpečne pristupovať Python objekty , ak GIL je v držbe aktuálne vlákno . GIL zaisťuje , že obe vlákna sú správne aktualizovať odkazy objekt volaná . Ak chcete začať používať GIL musíte uložiť stav závitu na umiestnenie premenné a uvoľniť globálnej zámok tlmočníkov . Na tomto mieste môžete vykonávať svoje blokujúce vstup /výstupné operácie a znovu získať globálny zámok tlmočníka , ak je to kompletné . Konečne , obnoviť stav vlákno z lokálnej premennej . Môžete použiť nasledujúci príklad makrá pre zjednodušenie procesu : Spojené

Py_BEGIN_ALLOW_THREADS ... Do niektorých blokujúce operácie I /O ... Py_END_ALLOW_THREADS
Volanie Python kód

Často nite sú vytvorené z iných programovacích jazykov , ako je C , a ak potrebujete volať viac nite potom budete musieť použiť Gil . Musíte najprv zaregistrovať tieto závity tlmočníka cez štátne dátové štruktúry vlákna a získať Gil . Pre zjednodušenie tohto procesu môžete použiť " PyGILState_Ensure ( ) " a " PyGILState_Release ( ) " funkcie . Nižšie je uvedený príklad , ako použiť túto koncepciu :

PyGILState_STATE gstate ; gstate = PyGILState_Ensure ( ) ;/* Vykonajte Python akcie tu . * /Result = CallSomeFunction ( ) ;/* zhodnotiť výsledok alebo manipuláciu výnimky * //* Uvoľnite závit . No Python API povolená za týmto bodom . * /PyGILState_Release ( gstate ) ;
Python Nite

V Pythone vlákno je reálny systém vlákno ako každý iný vykonávania programu . Pri vykonávaní vlákno Python vytvára malú dátovú štruktúru sa stať tlmočníkom . Potom, čo tento nový vlákno spustený a volá " PyEval_CallObject . " Posledným krokom je jednoduchá funkcia C, ktorý beží , čo Python uvedené. GIL starostlivo kontroluje každú prevedenie závitu . Nasledujúci príklad závitu Python :

import timeimport threadingclass CountdownThread ( threading.Thread ) : def __ init__ ( self , počet ) : threading.Thread.__init__ ( self ) self.count = countdef beh ( self ) : zatiaľ čo self.count > 0 : print " Odpočítavanie " , self.countself.count - = 1time.sleep ( 5 ) vrátiť
GIL problémy a náhradné
vývojári

Python sme diskutovali o odstránení GIL , ale naraziť na niekoľko problémov . Jeden problém často zmienil sa GIL je , že zabraňuje viacvláknové CPython programy od plne využívať viacjadrové procesory . Akékoľvek GIL výmena musí byť jednoduchá a súbežná pri práci s vláknami . Musí byť rýchlejší ako GIL a musí mať dobrú kompatibilitu API . Jeden príklad za kompatibilitu API je mať dobré sledovanie pri výpočte objektov , na ktorú odkazuje .

Najnovšie články

Copyright © počítačové znalosti Všetky práva vyhradené