当前位置: 首页 > 面试题库 >

使用cython的dask或joblib多重处理编译可执行文件会导致错误

姬俊远
2023-03-14
问题内容

我正在将一些串行处理的python作业转换为dask或joblib的多处理程序。可悲的是我需要在Windows上工作。
从IPython内部运行或从命令行调用python的py文件时,一切运行良好。
使用cython编译可执行文件时,它不再能正常运行:越来越多的进程(无限且大于请求的进程数)逐步启动并阻塞我的系统。
感觉就像多处理炸弹一样-但我当然使用if __name__=="__main__:"过控制块-通过在命令行上从python调用中正常运行来批准。
我的cython调用是的cython --embed --verbose --annotate THECODE.PY,我正在编译以gcc -time -municode -DMS_WIN64 -mthreads -Wall -O -I"PATH_TO_\include" -L"PATH_TO_\libs" THECODE.c -lpython36 -o THECODE生成Windows可执行文件THECODE.exe
与其他(单个处理)代码一起运行良好。
这个问题对于dask和joblib似乎是相同的(可能意味着dask的工作方式类似于Joblib或基于Joblib)。
有什么建议?

对于那些对mcve感兴趣的人:仅从Multiprocessing
Bomb中获取第一个代码,并使用上面的cython命令对其进行编译,将导致可执行文件崩溃。(我刚刚尝试过:-))

通过在代码示例中添加一行以显示,我发现了一些有趣的东西__name__

import multiprocessing

def worker():
    """worker function"""
    print('Worker')
    return

print("-->" + __name__ + "<--")
if __name__ == '__main__':
    jobs = []
    for i in range(5):
        p = multiprocessing.Process(target=worker)
        jobs.append(p)
        p.start()

当运行这段代码python时显示

__main__
__mp_main__
__mp_main__
__mp_main__
__mp_main__
__mp_main__

(其他输出被抑制)。说明if决策有效。在cython之后运行可执行文件并显示编译时

__main__
__main__
__main__
__main__
__main__
__main__

越来越多。因此,工人对模块的调用不再masqueraded像导入一样,因此每个工人都尝试以递归方式启动五个新对象。


问题答案:

我认为,根据提交的错误报告中的详细信息,我可以在此处提供最优雅的解决方案

if __name__ == '__main__':
    if sys.argv[0][-4:] == '.exe':
        setattr(sys, 'frozen', True)
    multiprocessing.freeze_support()
    YOURMAINROUTINE()

freeze_support()需要-call在Windows上-
看到蟒蛇多处理文档。
如果仅在该行中在python中运行,则已经可以了。
但不知何故,用Cython显然是不知道的一些这些东西(的文档告诉它与测试py2exePyInstallercx_Freeze)。它可以通过setattr-call缓解,该调用仅在编译时使用,因此由文件扩展名决定。



 类似资料:
  • 问题内容: 我有一个纯Python脚本,我想分发给具有未知Python配置的系统。因此,我想将Python代码编译为独立的可执行文件。 我奔波没有问题。那我跑 哪里给 并给 通过这种方式,我可以获得一个动态链接的可执行文件,该文件可以正常运行。产量 现在,我尝试将选项添加到gcc,但这会导致错误: 我检查了ldd给定的所有共享库是否也都安装为静态库。 那么,这与python3-config提供的选

  • 以下是我的cmake代码: 我尝试从链接中合并步骤,但没有工作,并得到以下错误: /usr/bin/ld:尝试动态对象的静态链接`/usr/lib/x86_64-linux-gnu/libglu.so'collect2:错误:ld返回1退出状态src/cmakefiles/wwest-export-app.out.dir/build.make:774:recipe for targe'bin/ww

  • 问题内容: 遇到一个错误地使用 而不是 在其代码中的人,它没有显示为编译错误。 是因为 是相同的 ? 问题答案: 没有编译错误,因为它是有效的(尽管相当无用) 一元运算符 ,其使用方式与以下方式相同: Java语言规范中的相关部分是Unary Plus运算符+(第15.15.3节) 。它指定调用一元运算会导致操作数的一元数值提升(第5.6.1节)。这意味着: * 如果操作数是编译时类型的,,,或,

  • 问题内容: 一直在玩cython。通常使用Python进行编程,但前世曾使用C。我不知道如何制作一个独立的可执行文件。 我已经下载了cython,并可以创建一个.pyx文件(这是一个带有.pyx扩展名的普通Python文件),可以使用以下命令在Python Shell中执行:import pyximport; pyximport.install() 我可以使用以下命令在命令行中生成.c文件:cyt

  • 我已经开始为一个个人项目学习JavaFX,事情进展顺利,直到我遇到了创建一组文本字段的问题。据我所知,代码是正确的,我使用的IDE没有给出任何错误指示。但当我尝试运行程序时,它会抛出一长串错误,这些错误在我注释创建文本字段的代码时不会发生。当这些代码行被省略时,程序将完全按照它应该的方式运行。 我正在使用InteliJ Idea,Windows 10,Javafx SDK 14.0.1和Java

  • 问题内容: 在kivy论坛中没有得到回应,因此请在这里尝试。 当我将教程pong代码编译为一个文件可执行文件时,我仍然必须将pong.kv文件包含在同一文件夹中才能运行。否则,启动exe时出现以下错误: 如何使它作为一个可执行文件运行。这是我的pong.spec文件: 请注意,我尝试将pong.kv包括在数据列表中,但这没有帮助。 谢谢,-Raj 问题答案: 根据KeyWeeUsr提供的链接(将数