Java Sanal Makinesi'nde neden GIL yok? Python neden bu kadar kötü birine ihtiyaç duyuyor?


177

Python böyle bir kötülüğe ihtiyaç duyarken, birinin Küresel Tercüman Kilidi (GIL) gerekmeden iş parçacıklarını güzel bir şekilde uygulamasına izin veren Java Sanal Makinesi hakkında temel olarak farklı olan şey hakkında bir fikir vermesini umuyorum.

Yanıtlar:


223

Python (dil) bir GIL'a ihtiyaç duymaz (bu yüzden JVM [Jython] ve .NET [IronPython] 'a mükemmel bir şekilde uygulanabilir ve bu uygulamalar çok yönlü olarak serbestçe kullanılabilir. CPython (popüler uygulama), kodlama kolaylığı (özellikle çöp toplama mekanizmalarının kodlanması) ve iş parçacığı için güvenli olmayan C kodlu kitaplıkların entegrasyonu için bir GIL kullanmıştır; -).

Yüksüz Swallow projesi, diğer iddialı hedefler arasında, yapar planı Python için bir GIL içermeyen sanal makine -. Ayrıca, GIL kaldırmak ve Python mulithread durumunu düzeltmek niyetinde", bu siteyi alıntı Biz bu olduğuna inanıyoruz IBM'in Recycler'ı gibi daha karmaşık bir GC sisteminin uygulanmasıyla mümkün olabilir (Bacon ve ark., 2001). "


6
Alex, eski GIL'i kaldırma girişimlerine ne demeli, bununla birlikte bir ton ek yük yoktu (hatırladığım 2 faktör)?
Bartosz Radaczyński

10
Evet, Bartosz, Greg Stein 1999'da bunu ölçtü. Referans sayımla çöp toplama işlemi, ince taneli kilitlemenin büyük yükünü zorlayan katildi. Bu yüzden orada daha gelişmiş bir GC çok önemlidir.
Alex Martelli

80
Yüksüz Yutmak ekibi
GIL'in kaldırılmasından vazgeçti

1
Unladen ve CPython'a alternatifler PyPy, Jython ve IronPython'dur. Son ikisinin GIL'si yoktur, ancak çoklu işlem modülünü kullanmak GIL'i yan yatırır ve yine de daha güvenlidir.
Cees Timmerman

50

JVM (en azından hotspot) "GIL" ile benzer bir konsepte sahiptir, kilit tanecikliğinden çok daha incedir, bunların çoğu daha gelişmiş olan hotspot'taki GC'lerden gelir.

CPython'da büyük bir kilit (muhtemelen doğru değil, ancak argümanlar için yeterince iyi), JVM'de nerede kullanıldığına bağlı olarak farklı kavramlarla daha fazla yayılıyor.

Etkin bir bariyer olan etkin nokta kodunda vm / runtime / safepoint.hpp dosyasına bir göz atın. Güvenli noktaya geldiğinde, python VM'nin GIL'de durması gibi, tüm VM java koduyla ilgili olarak durdu.

Java dünyasında bu tür VM duraklatma olayları "dünyayı durdur" olarak bilinir, bu noktalarda yalnızca belirli kriterlere bağlı yerel kod serbest çalışır, VM'nin geri kalanı durdurulmuştur.

Ayrıca java'da kaba bir kilidin olmaması JNI'nin yazılmasını çok daha zorlaştırıyor, çünkü JVM, FFI çağrıları için çevresi hakkında daha az garanti veriyor, cpython'un oldukça kolaylaştığı şeylerden biri (ctypes kullanmak kadar kolay olmasa da).


7

Bu blog yazısında aşağıda bir yorum var http://www.grouplens.org/node/244 , IronPython veya Jython için bir GIL ile bu kadar kolay dağıtımın nedenini ima CPython referans sayımını kullanırken diğer 2 VM'nin çöp toplayıcıları vardır.

Bunun neden böyle olduğunu tam olarak anlayamıyorum, ama kulağa mantıklı bir neden gibi geliyor.


5
İş parçacıkları arasında belirsiz bir şekilde nesneleri paylaşırken, artık kimsenin belirli bir nesneye referansı olmadığında çalışmak orta derecede gariptir. Global kilit ile referans sayımı (pahalı) bir yoldur. Bunu çözmenin farklı bir yolu, her seferinde yalnızca bir iş parçacığının nesneye referansları tutmasına izin vermek olurdu, bu da çoğu etkinliğin iş parçacıkları arası iletişimleri daha garip hale getirme pahasına evre yerel olmasını sağlayacaktır. Şahsen, HPC'nin işlemciler arasında paylaşılan bellek değil mesaj geçişi kullandığını ve ölçeklenebilirlik nedeniyle bunu yaptığını söylüyor ...
Donal Fellows

0

Bu linkte aşağıdaki açıklamaları var:

... "Tercüman'ın bazı bölümleri güvenli değildir, çünkü çoğunlukla büyük kilit kullanımıyla tüm iplik güvenliğini yapmak tek iş parçacığını aşırı derecede yavaşlatır ( kaynak ). ve CLR her seferinde bir referans sayısını kilitlemez / serbest bırakmaya gerek duymaz). Ancak birisi kabul edilebilir bir çözüm düşünüp uygulasa bile, üçüncü taraf kütüphaneleri hala aynı sorunlara sahip olurdu. "


-1

Python, jit / aot'tan yoksundur ve çok iş parçacıklı işlemcilerde yazıldığı zaman dilimi yoktu. Alternatif olarak, Julia lang'de GIL eksik olan her şeyi yeniden derleyebilir ve Python kodunuzda biraz hız artışı elde edebilirsiniz. Ayrıca Jython, Cpython ve Java'dan daha yavaş emiyor. Python'a bağlı kalmak istiyorsanız, paralel eklentiler kullanmayı düşünün, anında hız artışı elde edemezsiniz, ancak doğru eklenti ile paralel programlama yapabilirsiniz.


PyPy ne olacak?
denis631
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.