Istnieje kilka implementacji języka Python, na przykład CPython, IronPython, RPython itp.
Niektóre z nich mają GIL, inne nie. Na przykład CPython ma GIL:
From http://en.wikipedia.org/wiki/Global_Interpreter_Lock
Aplikacje napisane w językach programowania z GIL można zaprojektować tak, aby korzystały z oddzielnych procesów w celu osiągnięcia pełnej równoległości, ponieważ każdy proces ma własnego interpretera, a z kolei własny GIL.
Korzyści z GIL
- Zwiększona prędkość programów jednowątkowych.
- Łatwa integracja bibliotek C, które zwykle nie są bezpieczne dla wątków.
Dlaczego Python (CPython i inni) korzysta z GIL
W CPython globalna blokada interpretera (GIL) to muteks, który uniemożliwia wielu wątkom natywnym wykonywanie bajtów kodu Pythona jednocześnie. Ta blokada jest konieczna głównie dlatego, że zarządzanie pamięcią CPython nie jest bezpieczne dla wątków.
GIL jest kontrowersyjny, ponieważ uniemożliwia wielowątkowym programom CPython pełne wykorzystanie systemów wieloprocesorowych w określonych sytuacjach. Należy pamiętać, że potencjalnie blokujące lub długotrwałe operacje, takie jak operacje we / wy, przetwarzanie obrazu i niszczenie liczb NumPy, mają miejsce poza GIL. Dlatego tylko w programach wielowątkowych, które spędzają dużo czasu w GIL, interpretując kod bajtowy CPython, GIL staje się wąskim gardłem.
Python ma GIL w przeciwieństwie do drobnoziarnistego blokowania z kilku powodów:
Jest szybszy w przypadku jednowątkowym.
Jest szybszy w przypadku wielowątkowych programów związanych z operacjami we / wy.
Jest to szybsze w wielowątkowym przypadku programów związanych z procesorem, które wykonują intensywną pracę obliczeniową w bibliotekach C.
Ułatwia to pisanie rozszerzeń C: nie będzie przełączania wątków Pythona, chyba że pozwalasz na to (np. Między makrami Py_BEGIN_ALLOW_THREADS i Py_END_ALLOW_THREADS).
Ułatwia to pakowanie bibliotek C. Nie musisz się martwić o bezpieczeństwo wątków. Jeśli biblioteka nie jest bezpieczna dla wątków, po prostu trzymaj GIL zablokowany podczas jego wywoływania.
GIL można wydać za pomocą rozszerzeń C. Standardowa biblioteka Pythona uwalnia GIL wokół każdego blokującego wywołania we / wy. Zatem GIL nie ma wpływu na wydajność serwerów powiązanych z operacjami we / wy. Możesz zatem tworzyć serwery sieciowe w Pythonie, używając procesów (rozwidlenia), wątków lub asynchronicznych operacji we / wy, a GIL nie będzie przeszkadzał.
Biblioteki numeryczne w C lub Fortran można podobnie wywoływać po wydaniu GIL. Podczas gdy twoje rozszerzenie C czeka na zakończenie FFT, interpreter będzie wykonywał inne wątki Pythona. W tym przypadku GIL jest więc łatwiejszy i szybszy niż drobnoziarniste ryglowanie. Stanowi to większość pracy numerycznej. Rozszerzenie NumPy uwalnia GIL, gdy tylko jest to możliwe.
Wątki są zwykle złym sposobem na pisanie większości programów serwerowych. Jeśli obciążenie jest niskie, rozwidlenie jest łatwiejsze. Jeśli obciążenie jest wysokie, lepsze jest asynchroniczne we / wy i programowanie sterowane zdarzeniami (np. Przy użyciu Twisted Framework Pythona). Jedyną wymówką do używania wątków jest brak os.fork w systemie Windows.
GIL stanowi problem tylko wtedy, gdy wykonujesz intensywną pracę procesora w czystym języku Python. Tutaj możesz uzyskać bardziej przejrzysty projekt za pomocą procesów i przekazywania wiadomości (np. Mpi4py). W sklepie z serami Python znajduje się również moduł „przetwarzania”, który zapewnia procesom taki sam interfejs jak wątki (tj. Zamienia wątki. Wątek na przetwarzanie.Proces).
Wątki mogą być używane do utrzymania responsywności GUI niezależnie od GIL. Jeśli GIL pogarsza twoją wydajność (por. Powyższa dyskusja), możesz pozwolić, aby Twój wątek odrodził się proces i czekał na jego zakończenie.