为啥我不能在 cx_Freeze 中创建线程池?

Posted

技术标签:

【中文标题】为啥我不能在 cx_Freeze 中创建线程池?【英文标题】:Why can't I create a ThreadPool in cx_Freeze?为什么我不能在 cx_Freeze 中创建线程池? 【发布时间】:2019-06-29 10:03:18 【问题描述】:
Traceback (most recent call last):

  File "C:\Users\Jun\AppData\Local\Programs\Python\Python35\lib\site-packages\cx_Freeze\initscripts\__startup__.py", line 14, in run

    module.run()

  File "C:\Users\Jun\AppData\Local\Programs\Python\Python35\lib\site-packages\cx_Freeze\initscripts\Console.py", line 26, in run

    exec(code, m.__dict__)

  File "D:/ruanjian/new/Ui-Disign/hand_up_625.py", line 25, in <module>

    from keras.models import load_model

  File "C:\Users\Jun\AppData\Local\Programs\Python\Python35\lib\site-packages\keras\__init__.py", line 3, in <module>

    from . import utils

  File "C:\Users\Jun\AppData\Local\Programs\Python\Python35\lib\site-packages\keras\utils\__init__.py", line 4, in <module>

    from . import data_utils

  File "C:\Users\Jun\AppData\Local\Programs\Python\Python35\lib\site-packages\keras\utils\data_utils.py", line 19, in <module>

    from multiprocessing.pool import ThreadPool

ImportError: No module named 'multiprocessing.pool'

【问题讨论】:

【参考方案1】:

尝试将'multiprocessing'添加到setup.py脚本中build_exe_optionspackages列表中:

build_exe_options = "packages": ['multiprocessing']

# ...

setup(  name = ...,  # complete!
        ...
        options = "build_exe": build_exe_options,
        executables = [Executable(...)])

请参阅 cx_Freeze documentation 了解更多详情。

还请注意,您必须致电 multiprocessing.freeze_support() 以获取冻结脚本以继续使用多处理。根据documentation:

添加对使用多处理的程序被冻结以生成 Windows 可执行文件时的支持。 (已使用 py2exePyInstallercx_Freeze 进行测试。)

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

from multiprocessing import Process, freeze_support

def f():
    print('hello world!')

if __name__ == '__main__':
    freeze_support()
    Process(target=f).start()

如果freeze_support() 行被省略,那么尝试运行冻结的可执行文件将引发 RuntimeError。

在 Windows 以外的任何操作系统上调用 freeze_support() 时均无效。另外,如果模块在Windows上被Python解释器正常运行(程序没有被冻结),那么freeze_support()没有任何作用。

【讨论】:

【参考方案2】:

首先,您似乎缺少multiprocessing library,您可以使用 pip 获得。

其次,Python 3.5's multiprocessing documentation 不包括线程池。如果你想要一个进程池,你正在寻找:

 class multiprocessing.pool.Pool([processes[, initializer[, initargs[, maxtasksperchild[, context]]]]])

【讨论】:

现在的问题是关于导入错误,没有名为“multiprocessing.pool”的模块。 cx_Freeze 找不到模块:'multiprocessing.pool',我需要制作一个可执行文件 (.exe)。该代码可以完全运行,但是当我使用 cx_Freeze 制作可执行文件时出现导入错误,但我确实在多处理中找到了 pool.py 听起来 cx_freeze 没有看到那个库——the cx_freeze documentation 关于包含/包的解决方案有帮助吗?

以上是关于为啥我不能在 cx_Freeze 中创建线程池?的主要内容,如果未能解决你的问题,请参考以下文章

在 cx_freeze 中创建的 msi 不安装程序

为啥我不能在 SQL 中创建游标?

java线程池之一:创建线程池的方法

QT中想在子线程中创建对话窗口怎么建

为啥我不能在 Ubuntu 中创建原始套接字?

为啥在 Tornado 服务器 Post 方法中创建线程会产生运行时错误?