为什么 python GIL 没有启动这段多线程代码?
Why python GIL is not kicking in for this multithreaded code?
我 运行 以下一段纯 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
不是原子操作。
您可以在 What kinds of global value mutation are thread-safe?
下阅读更多内容
此外,请记住 Python 中的多线程不适用于 CPU 绑定程序(如您的程序)。这里的GIL只是指同一时刻只有一个线程会运行,不管有多少核
请注意,您的代码试图对前 1000 万个数字求和减去 5,000,000,因为您在 task_2
中跳过了它,它不包含在 task_1
中。
我 运行 以下一段纯 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
不是原子操作。
您可以在 What kinds of global value mutation are thread-safe?
此外,请记住 Python 中的多线程不适用于 CPU 绑定程序(如您的程序)。这里的GIL只是指同一时刻只有一个线程会运行,不管有多少核
请注意,您的代码试图对前 1000 万个数字求和减去 5,000,000,因为您在 task_2
中跳过了它,它不包含在 task_1
中。