Globální zámek tlumočníka
Global Interpreter Lock ( GIL ) je metoda synchronizace vláken používaná v některých interpretovaných programovacích jazycích , jako je Python a Ruby .
Podstata konceptu
GIL je nejjednodušší způsob, jak se vyhnout konfliktům, když různá vlákna přistupují ke stejné paměti ve stejnou dobu [1] . Když to jedno vlákno chytne, GIL, fungující jako mutex , blokuje ostatní. Žádná paralelní vlákna - žádné konflikty při přístupu ke sdíleným objektům. Pořadí provádění vláken určuje interpret v závislosti na implementaci, přepínání mezi vlákny může nastat: když se aktivní vlákno pokouší provést I/O , po vyčerpání limitu provedených instrukcí nebo časovačem [2] .
Výhody a nevýhody
Hlavní nevýhodou přístupu bezpečného pro vlákna GIL je omezení paralelismu . GIL neumožňuje dosažení největší výpočetní efektivity při práci na vícejádrových a víceprocesorových systémech [3] . Také použití více vláken vyžaduje režii na jejich přepínání v důsledku sporu (vlákna se „pokoušejí“ zachytit GIL). To znamená, že vícevláknové provádění může trvat déle než sekvenční provádění stejných úloh [4] .
Důvody, proč používat GIL:
- Jednovláknové skripty běží mnohem rychleji než jiné bezpečné přístupy;
- Snadná integrace knihoven C , které často také nejsou bezpečné pro vlákna;
- Snadná implementace.
Aplikace
GIL se používá v CPythonu , nejběžnější implementaci interpretu Python [5] , a v Ruby MRI , referenční implementaci interpretu Ruby , kde se nazývá Global VM Lock .
Na internetu se nejednou objevily petice a otevřené dopisy s žádostí o odstranění GIL z Pythonu [6] . Tvůrce a „ velkorysý celoživotní diktátor “ projektu, Guido van Rossum , však uvádí, že GIL není tak špatný a bude v CPythonu, dokud někdo jiný nepředstaví implementaci Pythonu bez GIL, se kterou fungovaly jednovláknové skripty. stejně rychle [7] [8] .
Implementace interpretů JVM ( Jython , JRuby ) a .NET ( IronPython , IronRuby ) nepoužívají GIL [9] [10] .
V rámci projektu PyPy se pracuje na implementaci transakční paměti ( anglicky Software Transactional Memory, STM ). Momentálně[ co? ] i ve vícevláknových výpočtech pracuje interpret s STM mnohonásobně pomaleji než s GIL. Ale díky JIT je PyPy-STM [11] stále rychlejší než CPython [12] .
Poznámky
- ↑ Stav vlákna a zámek globálního interpreta . Datum přístupu: 21. prosince 2013. Archivováno z originálu 24. prosince 2013. (neurčitý)
- ↑ Antoine Pitrou. Přepracování GIL . Python Mailing Lists (25. října 2009). Získáno 21. prosince 2013. Archivováno z originálu 10. června 2011. (neurčitý)
- ↑ Popis GIL . Python Wiki . Datum přístupu: 21. prosince 2013. Archivováno z originálu 24. prosince 2013. (neurčitý)
- ↑ David Beazley. Uvnitř Python GIL . Chicago: Chicago Python User Group (11. června 2009). Datum přístupu: 7. října 2009. Archivováno z originálu 24. prosince 2010. (neurčitý)
- ↑ Shannon-jj Behrens. Souběžnost a Python 2 . Dobb's Journal (3. února 2008). Získáno 12. července 2008. Archivováno z originálu dne 26. června 2008. (neurčitý)
- ↑ Otevřený dopis Guido van Rossumovi: Pane Rossume, zbourejte ten GIL! (nedostupný odkaz) . SnapLogic (9. září 2007). Archivováno z originálu 24. prosince 2013. (neurčitý)
- ↑ Guido van Rossum . budoucnost GIL . Python Mailing Lists (8. května 2007). Získáno 21. prosince 2013. Archivováno z originálu dne 9. listopadu 2020. (neurčitý)
- ↑ Guido van Rossum. Není snadné odstranit GIL . artima.com (10. září 2007). Získáno 21. prosince 2013. Archivováno z originálu 6. června 2019. (neurčitý)
- ↑ WhyJython . Python Wiki. Datum přístupu: 21. prosince 2013. Archivováno z originálu 22. prosince 2013. (neurčitý)
- ↑ IronPython . Python Wiki. Získáno 4. dubna 2011. Archivováno z originálu 12. června 2011. (neurčitý)
- ↑ [https://web.archive.org/web/20131224175835/http://bitbucket.org/pypy/pypy/raw/stm-thread/pypy/doc/stm.rst Archivováno 24. prosince 2013 na Wayback Machine PyPy-STM na Bitbucket ]
- ↑ Aktualizace STM . Python Wiki (16. října 2013). Datum přístupu: 21. prosince 2013. Archivováno z originálu 24. prosince 2013. (neurčitý)