我有一个基于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()
祝你好运, 小号
答案 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()