Blocare globală a interpretului

Global Interpreter Lock ( GIL ) este o  metodă de sincronizare a firelor de execuție utilizată în unele limbaje de programare interpretate , cum ar fi Python și Ruby .

Esența conceptului

GIL este cel mai simplu mod de a evita conflictele atunci când fire diferite accesează aceeași memorie în același timp [1] . Când un fir îl apucă, GIL, acționând ca un mutex , le blochează pe celelalte. Fără fire paralele - fără conflicte la accesarea obiectelor partajate. Ordinea de execuție a firelor de execuție este determinată de interpret în funcție de implementare, poate apărea comutarea între fire de execuție: atunci când un fir activ încearcă să efectueze I/O , după ce limita de instrucțiuni executate a fost epuizată , sau de un timer [2] .

Avantaje și dezavantaje

Principalul dezavantaj al abordării GIL thread -safe este limitarea paralelismului . GIL nu permite obținerea celei mai mari eficiențe de calcul atunci când se lucrează pe sisteme multi-core și multi -procesor [3] . De asemenea, utilizarea mai multor fire de execuție impune o suprasarcină la comutarea lor datorită efectului de dispută (firele „încearcă” să intercepteze GIL-ul). Adică, execuția multi-threaded poate dura mai mult decât execuția secvențială a acelorași sarcini [4] .

Motive pentru a utiliza GIL:

Aplicație

GIL este folosit în CPython , cea mai comună implementare a interpretului Python [5] , iar în Ruby MRI , implementarea de referință a interpretului Ruby , unde se numește Global VM Lock .

Pe net au apărut de mai multe ori petiții și scrisori deschise care le ceru să elimine GIL-ul din Python [6] . Cu toate acestea, creatorul și „ dictatorul generos pe viață ” al proiectului, Guido van Rossum , afirmă că GIL nu este atât de rău și va fi în CPython până când altcineva va introduce o implementare Python fără GIL, cu care scripturile cu un singur thread au funcționat doar la fel de repede [7] [8] .

Implementările interpretului JVM ( Jython , JRuby ) și .NET ( IronPython , IronRuby ) nu folosesc GIL [9] [10] .

Ca parte a proiectului PyPy , se lucrează la implementarea memoriei tranzacționale ( English  Software Transactional Memory, STM ). Pentru moment[ ce? ] chiar și în calculele cu mai multe fire, interpretul cu STM funcționează de multe ori mai lent decât cu GIL. Dar datorită JIT , PyPy-STM [11] este încă mai rapid decât CPython [12] .

Note

  1. Stare fir și blocare globală a interpretului . Data accesului: 21 decembrie 2013. Arhivat din original pe 24 decembrie 2013.
  2. Antoine Pitrou. Relucrarea GIL . Liste de corespondență Python (25 octombrie 2009). Preluat la 21 decembrie 2013. Arhivat din original la 10 iunie 2011.
  3. Descriere GIL . Python Wiki . Data accesului: 21 decembrie 2013. Arhivat din original pe 24 decembrie 2013.
  4. David Beazley. În interiorul Python GIL . Chicago: Grupul de utilizatori Chicago Python (11 iunie 2009). Data accesului: 7 octombrie 2009. Arhivat din original la 24 decembrie 2010.
  5. Shannon-jj Behrens. Concurență și Python 2 . Jurnalul lui Dobb (3 februarie 2008). Consultat la 12 iulie 2008. Arhivat din original la 26 iunie 2008.
  6. O scrisoare deschisă către Guido van Rossum: Domnule Rossum, dărâmați acel GIL! (link indisponibil) . SnapLogic (9 septembrie 2007). Arhivat din original pe 24 decembrie 2013. 
  7. Guido van Rossum . viitorul GIL . Liste de corespondență Python (8 mai 2007). Preluat la 21 decembrie 2013. Arhivat din original la 9 noiembrie 2020.
  8. Guido van Rossum. Nu este ușor să eliminați GIL . artima.com (10 septembrie 2007). Preluat la 21 decembrie 2013. Arhivat din original la 6 iunie 2019.
  9. WhyJython . Python Wiki. Data accesului: 21 decembrie 2013. Arhivat din original pe 22 decembrie 2013.
  10. IronPython . Python Wiki. Consultat la 4 aprilie 2011. Arhivat din original pe 12 iunie 2011.
  11. [https://web.archive.org/web/20131224175835/http://bitbucket.org/pypy/pypy/raw/stm-thread/pypy/doc/stm.rst Arhivat 24 decembrie 2013 la Wayback Machine PyPy-STM pe Bitbucket ]
  12. Actualizare la STM . Python Wiki (16 octombrie 2013). Data accesului: 21 decembrie 2013. Arhivat din original pe 24 decembrie 2013.