Concurrent.futures>在命令行中运行良好,而不是在使用pyinstaller或py2exe编译时

时间:2015-02-20 14:27:30

标签: python multiprocessing py2exe pyinstaller concurrent.futures

我有一个基于concurrent.futures的非常简单的脚本,它在命令行(Python 2.7)中运行良好,但在使用py2exe或Pyinstaller编译时崩溃(编译后的程序会打开越来越多的进程,并最终完全阻止窗口,如果我不要先杀掉他们。

代码非常标准/简单,所以我很难理解这个问题的根源......有没有人经历过这个问题? (我发现讨论涉及多处理的类似问题......但我无法用来解决我的问题)

# -*- coding: utf8 -*-
import os
import socket
import concurrent.futures

def simple_checkDomain(aDomain):
    print aDomain 
    # Do other stuff

def main():

    with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor:
        for domain in ["google.com","yahoo.com"]:
            job = executor.submit(simple_checkDomain, domain)

if __name__ == "__main__":
    main()

祝你好运, 小号

3 个答案:

答案 0 :(得分:4)

补充rdp的答案,该答案来自多处理文档中有关freeze support的提示:

您需要做的是将这些行添加到应用程序执行的开头:

from multiprocessing import freeze_support

if __name__ == '__main__':
    freeze_support()

以及来自文档的信息:

需要在主模块的if __name__ == '__main__'行之后直接调用此函数。

在测试中,我发现我需要将其添加到主应用程序模块,而不是使用concurrent.futures的模块,这意味着当进程派生时,可执行文件将再次启动,并且模块将在运行恢复到池之前运行。在我的PyQt应用尝试尝试启动新GUI的情况下,这尤其重要。

请注意,link from the other answer中的错误报告表明RuntimeError可能没有被提出,这就是我的情况。

答案 1 :(得分:3)

我在Python 3.4中遇到cx_freeze这个问题。经过一些谷歌搜索后,我登陆了这个错误报告: http://bugs.python.org/issue21505

这将我发送到以下文档,在我的应用中,它似乎解决了这个问题。

Python 2.7的建议解决方案,直接来自文档:multiprocessing.freeze_support

不确定这是否会为你正在使用的py2exe或Pyinstaller修复它,但我想发帖以防万一。

答案 2 :(得分:0)

此更改对我有效,正在使用python 3.6 +。

# -*- coding: utf8 -*-
import os
import socket
import concurrent.futures
from multiprocessing import freeze_support

def simple_checkDomain(aDomain):
    print aDomain 
    # Do other stuff

def main():

    with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor:
        for domain in ["google.com","yahoo.com"]:
            job = executor.submit(simple_checkDomain, domain)

if __name__ == "__main__":
    freeze_support()
    main()