0

以下代码将报错 NameError: name 'b' is not defined

from concurrent.futures import ProcessPoolExecutor
def add(a):
    return a+b

if __name__ == '__main__':
    b = 3
    with ProcessPoolExecutor() as executor:
        test = executor.submit(add,5)
    print(test.result())

但是如果你将 b = 3 移动到 if 语句之前,如下所示,它会运行而不会出错,为什么?

from concurrent.futures import ProcessPoolExecutor
def add(a):
    return a+b

b = 3
if __name__ == '__main__':
    with ProcessPoolExecutor() as executor:
        test = executor.submit(add,5)
    print(test.result())

顺便说一句,在函数中定义像 b 这样的全局变量的最佳实践是什么?

4

1 回答 1

0

@Aaron 和 @tchar 的评论非常贴切。但我确实想指出,有一种方法可以通过在构造函数上使用初始化程序initargs参数来初始化多处理池中的每个进程以获取所需的任何全局变量Pool

from concurrent.futures import ProcessPoolExecutor

def init_pool(b_value):
    # Initialize pool processes global varibales:
    global b
    b = b_value

def add(a):
    return a+b

if __name__ == '__main__':
    b = 3
    with ProcessPoolExecutor(initializer=init_pool, initargs=(b,)) as executor:
        test = executor.submit(add,5)
    print(test.result())
于 2021-08-14T12:11:29.000 回答