环境规划署:
Ubuntu - 18.04
Python - 3.6.6
cx_Freeze - 6.1
代码:
简单的main_script.py文件(存储库中的示例- https://github.com/Yuriy-Leonov/cython_multiprocessing_issue )
import multiprocessing
if __name__ == '__main__':
print("step-1")
multiprocessing.set_start_method("spawn")
print("step-2")
multiprocessing.freeze_support()
print("step-3")
manager = multiprocessing.Manager()
print("step-4")
s_dict = manager.dict()
print("finish")和setup.py (代表cx_Freeze):
import cx_Freeze
executables = [cx_Freeze.Executable("main_script.py")]
cx_Freeze.setup(
name="Example",
options={
"build_exe": {
"replace_paths": [("*", "")]
},
},
executables=executables
)问题:
在通过命令python setup.py build构建可执行文件之后,我运行它并包含以下控制台日志:
step-1
step-2
step-3
step-1
step-2
step-3
step-1
step-2
step-3
...产生了无限的过程。
我理解multiprocessing.Manager()应该生成“服务器”进程。但无法弄清楚当前的行为以及如何强迫它创建“共享数据集”。
重要信息:
由于主程序行为,不能更改和要求multiprocessing.set_start_method("spawn")。
问题:
如何在当前配置中实现manager.dict()的创建?
PS:
如果使用常规python <filename>运行没有问题(很明显)
发布于 2020-02-17 02:43:13
理解set_start_method("spawn")所做的事情很重要。
将您的脚本作为预编译的可执行文件运行并期望set_start_method("spawn")能够正常工作是没有意义的,因为"spawn"这里的意思是“通过重新调用解释器启动我的子进程”,但是“解释器”是您的预编译程序!
当您运行您的程序时,您会得到一个分叉炸弹,因为多处理模块试图生成以下进程:
$ ./main_script --multiprocessing-fork tracker_fd=6 pipe_handle=8
$ ./main_script -S -E -c 'from multiprocessing.semaphore_tracker import main;main(5)'这不适用于你的预编译程序。您需要将exec显式地放到python解释器中,或者如果您想让set_start_method("spawn")工作,就需要处理这些情况。
https://stackoverflow.com/questions/60228008
复制相似问题