2016-03-31 32 views
0

CPython'un GIL'si olduğu için, hiçbir parçanın aynı anda python kodu yürütmesine izin verilmez, böylece belirli bir işlem içinde iş parçacığı güvenliği görünür.CPython ve iş parçacığı modülü Kilitle()

Python iş parçacığı modülü Lock()'un amacı nedir? CPython'da, Lock() hiçbir iş parçacığının aynı anda çalışamamasına rağmen yardımcı olduğu hangi senkronizasyon sorunları olabilir?

cevap

1

GIL yalnızca bir seferde yalnızca bir iş parçacığının çalışabilmesini sağlar. Talimatlar arasında bir iş parçacığının kesintiye uğraması ve başka bir iş parçacığının çalışma şansının olması hala mümkündür. Bu nedenle, iki iş parçacığı paylaşılan bir kaynağa erişiyorsa, erişimin bir kilitle korunması gerekir.

şu örneği ele alalım:

from threading import Thread 

i = 0 

def func(): 
    global i 
    while i < 1000000: 
     i += 1 
     if i != i: 
      print("i was modified") 

for _ in range(10): 
    Thread(target=func).start() 

muhtemelen hiç doğru olamaz if durum gibi görünmekle birlikte, yazdırılan satır göreceksiniz iyi bir şans var. Nasıl olabilir? İlgili talimatlar 25 ve 28. olan

7   0 SETUP_LOOP    51 (to 54) 
     >> 3 LOAD_GLOBAL    0 (i) 
       6 LOAD_CONST    1 (1000000) 
       9 COMPARE_OP    0 (<) 
      12 POP_JUMP_IF_FALSE  53 

    8   15 LOAD_GLOBAL    0 (i) 
      18 LOAD_CONST    2 (1) 
      21 INPLACE_ADD 
      22 STORE_GLOBAL    0 (i) 

    9   25 LOAD_GLOBAL    0 (i) 
      28 LOAD_GLOBAL    0 (i) 
      31 COMPARE_OP    3 (!=) 
      34 POP_JUMP_IF_FALSE  3 

10   37 LOAD_GLOBAL    1 (print) 
      40 LOAD_CONST    3 ('i was modified') 
      43 CALL_FUNCTION   1 (1 positional, 0 keyword pair) 
      46 POP_TOP 
      47 JUMP_ABSOLUTE   3 
      50 JUMP_ABSOLUTE   3 
     >> 53 POP_BLOCK 
     >> 54 LOAD_CONST    0 (None) 
      57 RETURN_VALUE 

iplik alırsa: Eğer (dis modülünden dis.dis(func) arayarak) func demonte baytkoduna bakarsak

, bu ne alırsınız olduğunu Bu iki talimat arasında kesintiye uğramış, başka bir therad global değişkeni i değiştirebilir ve saklanan değerler farklı olacaktır.

+0

Gerçekten güzel cevap! teşekkür ederim – dylan7