在下面的代码中,为什么可以从cb_async访问dispatchLock
,但不能从变量my_var
访问。
我在local variable 'my_var' referenced before assignment
中收到错误cb_async
。
即使将global my_var
放入cb_async也无济于事!
import multiprocessing
import threading
import time
def theWorker():
resp = "RANDOM_VAL"
return resp
def processInParallel():
dispatchLock = threading.Lock()
my_var = 0
def cb_async(res):
# global my_var ## Even putting a global here doesn't help
print("Inside callback")
print(dispatchLock)
with dispatchLock:
my_var = my_var + 1 # ERROR: local variable 'my_var' referenced before assignment
pass
cpu = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes=cpu)
for x in range(0, cpu):
pool.apply_async(theWorker, args=(), callback=cb_async)
time.sleep(2)
return
if __name__ == '__main__':
processInParallel()
虽然可以肯定地在cb_async中访问my_var
(例如,可能使用multiprocessing.Value
和/或将值作为函数的参数传递),但我发现这种行为确实很奇怪
当然,cb_async
在主线程的上下文中运行。我已经检查过了。
注意:,如果我将my_var
放在全局级别(在任何函数之外),则此代码有效。但是,为什么dispatchLock不需要相同的内容?