【发布时间】:2014-09-29 16:04:23
【问题描述】:
我必须在这里遗漏一些东西,但是这个两个线程试图修改函数中的全局变量的简单示例并没有给出预期的结果:
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
正如您所见,两个线程都进入了应该同时锁定的部分,因此全局变量“some_var”的增量被混淆了。
看起来 Lock 由于某种原因无法正常工作。 对于高达 10000 的范围,它可以工作,但这可能只是因为在如此短的计算期间没有释放 GIL。
发生了什么事?
我使用的是 Python3.3.2 64bit
【问题讨论】:
标签: python multithreading locking python-multithreading