我必须在这里遗漏一些东西但是这个试图修改函数中的全局变量的两个线程的简单示例没有给出预期的结果:
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)
Run Code Online (Sandbox Code Playgroud)
输出:
1 here!
2 here!
2 leaving!
1 leaving!
1352010
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,两个线程都会进入同时被锁定的部分,并且globel变量'some_var'的增量会因此而混淆.
看起来Lock由于某种原因不起作用.对于高达10000的范围,它正在工作,但这可能仅仅是因为在这样的短计算期间没有释放GIL.
到底是怎么回事?
我正在使用Python3.3.2 64位