首页 > 解决方案 > 如何防止子进程在我从另一个模块 (Calling.py) 调用的模块 (control.py) 中无限生成?

问题描述

我有一个名为 control.py 的模块,我在其中使用以下精简代码-

def parallel_execution():
    if __name__=="__main__":
       process=multiprocessing.Process(target=worker_function) ##the worker_function has been defined appropriately
       process.start()
       process.join()
    return
def main(main_args):
    if multiprocessing_flag == True:
       parallel_execution()
    
if __name__=='__main__':
    main(sys.argv[1:])

我有另一个名为 Calling.py 的模块,我希望从中执行 parallel_execution() 中定义的多处理功能。问题是如果我使用该(if __name__=='__main__' )块,那么我无法从另一个脚本调用 control.py。如果我仍然使用runpy.run_module("control",run_name='__main__')我会得到一个错误,说 worker_function 不能被腌制。

如何调用 control.py 以便运行 parallel_execution 函数?换句话说,有没有办法防止我的父进程在不使用的情况下无限生成子进程,if __name__=='__main__'以便我仍然可以从 Calling.py 调用 control.py ?

标签: pythonpython-3.xpython-multiprocessingchild-process

解决方案


有两种方法可以防止子进程递归生成——其中一种是阻止子进程生成if __name__=='__main__'更多进程的代码块。另一种方法与子进程的工作方式有关——事实上,当使用 multiprocessing.Process 或 multiprocessing.Pool(内部使用 multiprocessing.Process)调用子进程时,它们会继承包含传递的目标函数的脚本到 multiprocessing.Process(target=worker_function,args=....,....) 。因此,如果包含目标(worker_function)的脚本被定义在一个单独的模块中,然后被导入,那么递归生成子进程的问题就被消除了。

参考- https://pymotw.com/3/multiprocessing/basics.html#importable-target-functions

因此,在我上面的问题中,我所要做的就是将 worker_function 放在与“”模块分开的 python 模块中control.py


推荐阅读