从apply_async访问回调中的变量

时间:2018-09-05 03:02:28

标签: python python-3.x multiprocessing python-internals

在下面的代码中,为什么可以从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不需要相同的内容?

0 个答案:

没有答案