为什么 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 中。