首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ubuntu、cx_Freeze和multiprocessing.Manager()在“生成”类型进程中的冲突

Ubuntu、cx_Freeze和multiprocessing.Manager()在“生成”类型进程中的冲突
EN

Stack Overflow用户
提问于 2020-02-14 14:12:40
回答 1查看 266关注 0票数 7

环境规划署:

Ubuntu - 18.04

Python - 3.6.6

cx_Freeze - 6.1

代码:

简单的main_script.py文件(存储库中的示例- https://github.com/Yuriy-Leonov/cython_multiprocessing_issue )

代码语言:javascript
复制
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):

代码语言:javascript
复制
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构建可执行文件之后,我运行它并包含以下控制台日志:

代码语言:javascript
复制
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>运行没有问题(很明显)

EN

回答 1

Stack Overflow用户

发布于 2020-02-17 02:43:13

理解set_start_method("spawn")所做的事情很重要。

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

当您运行您的程序时,您会得到一个分叉炸弹,因为多处理模块试图生成以下进程:

代码语言:javascript
复制
$ ./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")工作,就需要处理这些情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60228008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档