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

2024-02-21

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

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)

outputs:

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

正如您所看到的,两个线程都进入了应该同时锁定的部分,并且全局变量“some_var”的增量因此而混合在一起。

看起来锁由于某种原因不起作用。 对于高达 10000 的范围,它可以工作,但这可能只是因为 GIL 在如此短的计算过程中没有被释放。

到底是怎么回事?

我使用的是Python3.3.2 64位


The 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))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 线程锁在简单示例中不起作用 的相关文章

随机推荐