如何解决为什么 python GIL 没有加入这个多线程代码?
我运行以下纯 python 代码,据我所知,GIL 应该启动并避免同时访问变量 x
,因此 x
应该对前 1000 万个数字求和,但它没有t 工作并每次都给出不同的结果,这让我相信当两个线程都访问变量 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 只是意味着无论有多少核,都只会同时运行一个线程。
请注意,由于您在 task_2
中跳过它,因此您的代码正在尝试对前 1000 万个数字求和减去 5,000,000,并且它未包含在 task_1
中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。