python - 如何防止子进程在我从另一个模块 (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 ?
解决方案
有两种方法可以防止子进程递归生成——其中一种是阻止子进程生成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
。
推荐阅读
- python - Pandas,字典列表,其中值是一个列表。将字典键转换为列名。将值列表中的每个元素转换为一行
- swiftui - 更新点击手势上的按钮文本
- python - Pylint:'无法导入'pathlib'(导入错误)'
- ios - 使用 Fastlane 发送 Codacy 代码覆盖率
- javascript - 404 无法使用 Express POST
- javascript - 我无法获取此 html 代码来显示我想要的内容
- javascript - 如何将数组中的特定图像调用为 Vanilla JavaScript 中的参数?
- spring-cloud-stream - SCDF Spring Cloud Stream 从 2.1.4 迁移到引导 2.2.4 版本中断了 kafka avro 流
- javascript - 何时在操作中使用调度与返回?
- python - 从视频中裁剪人脸并另存为图像