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.
Gerçekten güzel cevap! teşekkür ederim – dylan7