gpt4 book ai didi

Python线程锁在简单示例中不起作用

转载 作者:太空狗 更新时间:2023-10-30 01:58:39 24 4
gpt4 key购买 nike

我一定在这里遗漏了一些东西,但是这个简单的两个线程试图修改函数中的全局变量的例子并没有给出预期的结果:

from threading import Thread, Lock
some_var = 0

def some_func(id):
lo = Lock()
with lo:
global some_var
print("{} here!".format(id))
for i in range(1000000):
some_var += 1
print("{} leaving!".format(id))


t1 = Thread(target=some_func, args=(1,))
t2 = Thread(target=some_func, args=(2,))
t1.start()
t2.start()
t1.join()
t2.join()
print(some_var)

输出:

1 here!
2 here!
2 leaving!
1 leaving!
1352010

如您所见,两个线程都进入了应该同时锁定的部分,因此 globel 变量“some_var”的递增被混淆了。

Lock 似乎出于某种原因无法正常工作。对于高达 10000 的范围,它是有效的,但这可能只是因为在如此短的计算期间没有释放 GIL。

这是怎么回事?

我使用的是 Python3.3.2 64 位

最佳答案

Lock() 函数创建一个全新的锁 - 只有调用该函数的线程才能使用。这就是它不起作用的原因,因为每个线程都在锁定一个完全不同的锁。

锁定项目是您可以毫无问题地声明为全局的少数事物之一,因为您绝对希望每个线程都看到相同的 Lock()。你应该试试这个:

from threading import Thread, Lock
some_var = 0
lo = Lock()

def some_func(id):
global lo
with lo:
global some_var
print("{} here!".format(id))
for i in range(1000000):
some_var += 1
print("{} leaving!".format(id))

关于Python线程锁在简单示例中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25165148/

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