SORU
19 EYLÜL 2008, Cuma


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
19 EYLÜL 2008, Cuma


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Outler

    Adam Outler

    19 EKİM 2006
  • Rugiagialia

    Rugiagialia

    1 Ocak 2008
  • Tomas N

    Tomas N

    14 Kasım 2010