Bu GİL yüzünden bir çok iş parçacıklı Python kodu kilitler gereksiz?
Global Yorumlayıcı bir Kilit (yani CPython) Python uygulaması güvenerek ve çok iş parçacıklı kod yazıyorsanız, gerçekten kilitleri ihtiyacın var mı?
Eğer GİL birden fazla talimatları paralel olarak yürütülen izin değilse, paylaşılan veri korumak için gereksiz olmaz mı?
bu aptalca bir soru olacak ama bu da bir şeydir özür dilerim her zaman işlemci çok çekirdekli makinelerde Python hakkında merak ettim.
aynı şey bir GİL olan başka bir dil uygulaması için de geçerli olacak.
CEVAP
Yine de eğer iş arasında devlet paylaşırsanız kilitleri gerekir. GİL, yalnızca içten tercüman korur. Hala kendi kodunuzda tutarsız güncelleştirmeler olabilir.
Örneğin:
#!/usr/bin/env python
import threading
shared_balance = 0
class Deposit(threading.Thread):
def run(self):
for _ in xrange(1000000):
global shared_balance
balance = shared_balance
balance = 100
shared_balance = balance
class Withdraw(threading.Thread):
def run(self):
for _ in xrange(1000000):
global shared_balance
balance = shared_balance
balance -= 100
shared_balance = balance
threads = [Deposit(), Withdraw()]
for thread in threads:
thread.start()
for thread in threads:
thread.join()
print shared_balance
Burada, kodunuzu paylaşılan durum (balance = shared_balance
) okuma ve yazma arasında değişen sonucu geri (shared_balance = balance
), kayıp bir güncelleme neden kesintiye olabilir. Sonuç ortak devlet için rastgele bir değerdir.
Güncelleştirmeleri tutarlı hale getirmek için, çalışma yöntemleri-değiştirme-okuma ve yazma bölümleri (döngü içinde) veya some way to detect when the shared state had changed since it was read paylaşılan bir devlet kilitlemek gerekir.
Python kodu nasıl koruyabilirim?...
Neden Python kodu derlemek?...
Nasıl bir dize Python Python kodu içer...
Python sözlü kilitler...
Geçerli Python kodu bir yöntem gelen ç...