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.
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:
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). "
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).
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.
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. "
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.