如何生成具有与父进程相同参数的Python多进程?

如何生成具有与父进程相同参数的Python多进程?,python,python-3.x,Python,Python 3.x,我想使用多处理并行化python脚本的do_something方法。do_something中的实际处理取决于通过cli参数传入的父进程中的值 有没有办法将此值传递给派生的进程?新流程不需要更改/保留值,只需读取它即可 下面是一个失败的代码示例,其中包含一个NameError:未定义名称“args” 如何将args.foo传递给生成的进程 编辑:我已经了解了初始化器,但问题仍然存在。这给了我与上面相同的名称错误: import argparse import collections from m

我想使用多处理并行化python脚本的do_something方法。do_something中的实际处理取决于通过cli参数传入的父进程中的值

有没有办法将此值传递给派生的进程?新流程不需要更改/保留值,只需读取它即可

下面是一个失败的代码示例,其中包含一个NameError:未定义名称“args”

如何将args.foo传递给生成的进程

编辑:我已经了解了初始化器,但问题仍然存在。这给了我与上面相同的名称错误:

import argparse
import collections
from multiprocessing import Pool, get_context


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--foo', required=True, type=int)
    global args # need this if I'm reading from threads / forks
    args = parser.parse_args()

    print('This prints fine')
    with get_context('spawn').Pool(processes=4, initializer=init(args)) as pool:
        results = collections.deque(pool.imap_unordered(do_something, [0, 1, 2, 3, 4 ]), 0)

    print(results)
    return

def init(n):
    global args
    args = n

def do_something(i):
    if args.foo > 0:
        print('do something')
    else:
        print('do something else')
    return i

if __name__=="__main__":
    main()

您的初始值设定项代码在正确的轨道上,但您做得不太正确。在池构造函数中传递关键字参数initializer=initargs时,您在主进程中调用init,并将其返回值None作为池的初始值设定项传递。那不是你想要的

相反,您只需要将init作为初始值设定项参数传递,并将其单独接受的参数作为initargs传递。这样池就可以在每个子进程中调用函数。应该是这样的:

with get_context('spawn').Pool(processes=4, initializer=init, initargs=(args,)) as pool:
    ...

您需要将参数传递给函数。将args设为全局变量不起作用,因为新进程从不在主进程中执行代码。您能为我指出使用imap执行该操作的正确方向吗?我不确定其他参数在map/imap模型中是如何工作的。我没想到。谢谢你的帮助!
with get_context('spawn').Pool(processes=4, initializer=init, initargs=(args,)) as pool:
    ...