我运行了以下一段纯python代码,据我所知,GIL应该启动并避免同时访问变量x
,因此x
应该为前1000万个数字求和,但它不起作用,每次都会给出不同的结果,这让我相信当两个线程都访问变量x
时,没有互斥。
from threading import Thread
x = 0
def task_1():
global x
for i in range(5000000):
x += i
def task_2():
global x
for i in range(5000001, 10000000):
x += i
t1 = Thread(target=task_1)
t2 = Thread(target=task_2)
t1.start()
t2.start()
t1.join()
t2.join()
print(f"X value is {x}")
x += y
不是原子操作。你可以在"什么类型的全局值突变是线程安全的?"?
另外,请记住Python中的多线程不适用于CPU绑定程序(如您的程序(。这里的GIL只是意味着无论有多少内核,只有一个线程会同时运行。
请注意,您的代码正试图将前1000万个数字加和减去5000000,因为您在task_2
中跳过了它,而它不包含在task_1
中。