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