gpt4 book ai didi

python - 使用python多线程时需要锁吗?

转载 作者:太空狗 更新时间:2023-10-30 02:21:53 24 4
gpt4 key购买 nike

想想这段代码:

#!/usr/bin/env python

from threading import Thread

count = 0

def test():
global count
for i in range(10):
count = count + 1

if __name__ == '__main__':
for i in range(1000):
Thread(target = test).start()
print count

我使用多线程,但结果总是正确的。这是否意味着我可以在实现访客计数器之类的东西时使用没有锁的 python 线程?

最佳答案

你确实需要一个。尽管多线程在 Python 中的工作方式不同,但由于 Global Interpreter Lock ,在 Python 字节码中不是原子的操作仍然需要锁定。

在您的情况下,您可以检查函数 test (dis.dis(test)) 的字节码:

 3           0 SETUP_LOOP              30 (to 33)
3 LOAD_GLOBAL 0 (range)
6 LOAD_CONST 1 (1000)
9 CALL_FUNCTION 1
12 GET_ITER
>> 13 FOR_ITER 16 (to 32)
16 STORE_FAST 0 (i)

4 19 LOAD_GLOBAL 1 (count) # start of increment
22 LOAD_CONST 2 (1)
25 BINARY_ADD
26 STORE_GLOBAL 1 (count) # end of increment
29 JUMP_ABSOLUTE 13
>> 32 POP_BLOCK
>> 33 LOAD_CONST 0 (None)
36 RETURN_VALUE

如您所见,增量是字节码级别的 2x 加载、更新和存储,因此这行不通。增量实际上是 4 个独立的操作,您必须保护它们以确保它们不被中断。

在您的示例中,即使您使用 count += 1,问题仍然存在,如字节码所示:

4          19 LOAD_GLOBAL              1 (count)
22 LOAD_CONST 2 (1)
25 INPLACE_ADD
26 STORE_GLOBAL 1 (count)

关于python - 使用python多线程时需要锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13561220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com