You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyCharm正常运行的代码经PyInstaller打包为exe后无限循环崩溃

PyInstaller打包exe后多进程无限循环的原因及解决办法

核心原因

Windows下multiprocessing采用spawn模式启动子进程,会重新导入整个脚本。如果你的主程序逻辑(比如创建进程池、调用load_documents的代码)没放在if __name__ == '__main__':块里,子进程启动时会重复执行这些逻辑,无限创建新的进程池,最终导致循环崩溃,同时重复输出主逻辑里的日志(比如"Creating new vectorstore")。另外,PyInstaller打包多进程程序时,缺少freeze_support()调用也会导致进程初始化异常,间接引发循环问题。

解决步骤

  • 用if __name__ == '__main__':包裹所有主逻辑
    把启动程序的代码(比如初始化进程池、调用load_documents、创建vectorstore的逻辑)全部放到这个判断块里,确保只有主进程会执行这些代码,子进程导入脚本时只会加载函数定义,不会重复执行主逻辑。示例:

    import multiprocessing
    
    def load_single_document(file):
        # 你的文件处理逻辑
        pass
    
    def load_documents(filtered_files):
        with multiprocessing.Pool() as pool:
            for i, docs in enumerate(pool.imap_unordered(load_single_document, filtered_files)):
                # 后续处理逻辑
                pass
    
    if __name__ == '__main__':
        multiprocessing.freeze_support()
        filtered_files = ["file1.txt", "file2.txt"]
        load_documents(filtered_files)
    
  • 添加freeze_support()调用
    在if __name__ == '__main__':的第一行加上multiprocessing.freeze_support(),这是PyInstaller打包Windows多进程程序的必备操作,用来处理打包后的进程启动流程。

  • 确保子进程能访问目标函数
    load_single_document等被进程池调用的函数必须定义在全局作用域(不能放在if __name__ == '__main__':块里),否则子进程无法导入这些函数,会导致任务执行失败,甚至触发主进程重复提交任务的情况。

  • 检查第三方依赖打包情况
    如果用到langchain这类第三方库,打包时用--collect-all langchain这类参数强制收集所有依赖,避免子进程因缺少依赖崩溃,进而引发循环。

内容的提问来源于stack exchange,提问作者Haski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:57:07