为什么python-GIL没有参与这个多线程代码



我运行了以下一段纯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中。

最新更新