如果你在线程之间共享状态,你仍然需要锁。 GIL只在内部保护解释器。您仍然可以在自己的代码中有不一致的更新。
例如:
#!/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
这里,您的代码可能会在读取共享状态(balance = shared_balance)和写回更改的结果(shared_balance = balance)之间中断,导致更新丢失。结果是共享状态的随机值。