python - Ubuntu、cx_Freeze 和 multiprocessing.Manager() 在 "spawn"类型进程的情况下发生冲突

标签 python linux ubuntu multiprocessing cx-freeze

环境:

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> 运行没有问题(明显的)

最佳答案

了解 set_start_method("spawn") 的内容很重要做。

将脚本作为预编译的可执行文件运行并期望 set_start_method("spawn") 是没有意义的只是工作,因为"spawn"这里的意思是“通过重新调用解释器来启动我的子进程”,但“解释器”是你的预编译程序!

当你运行你的程序时,你会得到一个 fork 炸弹,因为 multiprocessing 模块试图产生以下进程:

$ ./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")去工作。

关于python - Ubuntu、cx_Freeze 和 multiprocessing.Manager() 在 "spawn"类型进程的情况下发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60228008/

相关文章:

linux - 使用 vim 编辑 java 文件时未知选项 java complete#complete

ubuntu - 在 Linux 中检测已安装的硬盘驱动器

python - 将异常保存到python中的文件

python - 读取 pickle 在 Python 3.6 中的性能比在 Python 2.7 中更差

python - 如果标题中的所有单词 : match

linux - apache mod_rewrite 不适用于 .htaccess 文件

linux - 无法永久设置环境变量 PATH

python - django、uni_form 和 python 的 __init__() 函数 - 如何将参数传递给表单?

python - 配置 MySQL 以与 Django 一起使用

javascript - 在 Ubuntu 中模拟无 Flash