from threading import Thread,Lock,current_thread
import time
n = 100
mutex = Lock()
def task():
global n
# mutex.acquire()
time.sleep(1)
print(current_thread().getName(), n)
temp = n
n = temp - 1
# mutex.release()
if __name__ == "__main__":
for i in range(3):
t = Thread(target=task)
t.start()
结果:
Thread-3 100
Thread-2 100
Thread-1 100
Process finished with exit code 0
因为第一个线程开启并取得GIL,得到的n是100,在做IO时,GIL被释放并给了下一个线程得到的n还是为100,第二个线程做IO时GIL被释放并给了第三个线程得到的n还是为100。因为刚发送开线程的指令,并且还要做IO,主线程此时得到的n还是100,故打印的结果为100。
如果在task加一把互斥锁,则会输出正确结果。
from threading import Thread,Lock,current_thread
import time
n = 100
mutex = Lock()
def task():
global n
mutex.acquire()
time.sleep(1)
print(current_thread().getName(), n)
temp = n
n = temp - 1
mutex.release()
if __name__ == "__main__":
for i in range(3):
t = Thread(target=task)
t.start()
结果:
Thread-1 100
Thread-2 99
Thread-3 98
Process finished with exit code 0
每个线程得到n都是之前继承于上一个线程计算的结果。