Python'un birkaç uygulaması vardır, örneğin, CPython, IronPython, RPython, vb.
Bazılarında bir GIL var, bazılarında yok. Örneğin, CPython'da GIL bulunur:
Gönderen http://en.wikipedia.org/wiki/Global_Interpreter_Lock
Programlama dillerinde bir GIL ile yazılmış uygulamalar, her paralellik kendi yorumlayıcısına ve kendi CİL'sine sahip olduğundan, tam paralellik elde etmek için ayrı işlemleri kullanmak üzere tasarlanabilir.
GIL'in Faydaları
- Tek iş parçacıklı programların artan hızı.
- Genellikle iş parçacığı güvenliği olmayan C kütüphanelerinin kolay entegrasyonu.
Python (CPython ve diğerleri) neden GIL’i kullanıyor?
CPython'da global yorumlayıcı kilidi veya GIL, birden fazla yerel iş parçasının Python bytecode'larını aynı anda çalıştırmasını önleyen bir muteks'tir. Bu kilit özellikle CPython'un bellek yönetimi iş parçacığı güvenliği olmadığından gereklidir.
GIL tartışmalıdır çünkü çok iş parçacıklı CPython programlarının belirli durumlarda çok işlemcili sistemlerden tam olarak yararlanmasını önler. G / Ç, görüntü işleme ve NumPy numara kırma gibi potansiyel olarak engelleme veya uzun süren işlemlerin GIL dışında gerçekleştiğini unutmayın. Bu nedenle, yalnızca GIL'in içinde çok fazla zaman harcayan, CPython baytını yorumlayan, GIL'in bir darboğaz haline geldiği çok iş parçacıklı programlarda yer almaktadır.
Python çeşitli nedenlerden dolayı ince taneli kilitlemenin aksine bir GIL'ye sahiptir:
Tek iş parçacıklı durumda daha hızlıdır.
G / ç bağlı programlar için çoklu iş parçacıklı durumda daha hızlıdır.
C-kütüphanelerinde bilgi işlem-yoğun çalışma yapan cpu-bağlı programlar için çoklu iş parçacıklı durumda daha hızlı.
C uzantılarının yazılmasını kolaylaştırır: gerçekleşmesine izin verdiğiniz yer dışında Python iş parçacığı düğmesi olmayacaktır (örn. Py_BEGIN_ALLOW_THREADS ve Py_END_ALLOW_THREADS makroları arasında).
C kitaplıklarının sarılmasını kolaylaştırır. İplik güvenliği konusunda endişelenmenize gerek yok. Kitaplık güvenli bir şekilde güvenli değilse, GIL'yi çağırırken kilitli tutmanız yeterlidir.
GIL, C uzantılarıyla serbest bırakılabilir. Python'un standart kütüphanesi, GIL'yi her engelleme i / o çağrısı etrafında serbest bırakır. Bu nedenle GIL, bağlı sunucuların performansı için bir sonuç vermez. Böylece, Python'da ağ (network), thread veya asenkron g / Ç kullanarak ağ sunucuları oluşturabilirsiniz.
C veya Fortran'daki sayısal kütüphaneler benzer şekilde serbest bırakılan GIL ile çağrılabilir. C uzantınız bir FFT'nin tamamlanmasını beklerken, tercüman diğer Python iş parçacıklarını yürütecektir. Böylece bir GIL, bu durumda da ince ayarlı kilitlemeden daha kolay ve hızlıdır. Bu, sayısal çalışmanın büyük bölümünü oluşturur. NumPy uzantısı, mümkün olduğunda GIL'yi serbest bırakır.
Konu, çoğu sunucu programlarını yazmak için genellikle kötü bir yoldur. Yük düşükse, çatallamak daha kolaydır. Yük yüksekse, zaman uyumsuz g / ç ve olay odaklı programlama (örn. Python's Twisted framework'ü kullanarak) daha iyidir. Iş parçacığı kullanmak için tek bahane Windows'ta os.fork eksikliğidir.
GIL, saf Python'da CPU yoğun bir çalışma yapıyorsanız ve ancak eğer yapıyorsanız sorun olabilir. Burada süreçleri ve mesaj iletmeyi (örneğin mpi4py) kullanarak daha temiz tasarım elde edebilirsiniz. Ayrıca Python peynir dükkanında 'işlem' modülü de vardır, bu işlem süreçler ipliklerle aynı arayüzü verir (yani diş açmanın yerine geçer. İşlemle işlem. İşlem).
Konular, GIL'den bağımsız olarak bir GUI'nin yanıt vermesini sağlamak için kullanılabilir. GIL performansınızı bozarsa (yukarıdaki tartışmaya bakın), iş parçacığınızın bir süreci oluşturmasına ve bitmesini beklemesine izin verebilirsiniz.