Python多进程程序打包成EXE无限创建子进程问题的解决方案

拾光
拾光
发布时间:2026-10-16 | 5人浏览过
原创

本文介绍Python多进程程序打包为EXE后,因未正确调用freeze_support导致无限创建子进程并卡死电脑的问题。解决方案是在if __name__ == '__main__'语句后的下一行立即添加multiprocessing.freeze_support(),以阻止系统无限创建子线程,确保程序正常运行。

Python多进程打包EXE后无限创建子进程问题的解决方案

以下是涉及多进程处理的部分代码片段:

if __name__ == '__main__':
    """"流程模拟"""
    multiprocessing.freeze_support() # 打包成exe时,需要该语句,防止系统无限创建子线程
    print(f"{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())} - [主进程] - 程序已启动")
    if WORKERS > 0:
        print(f"{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())} - [主进程] - 当前为并发爬取,每次采集{WORKERS}条url")
    else:
        print(f"{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())} - [主进程] - 当前为单线程爬取,时间间隔为{INTERVAL}秒")

    init_data_queue = multiprocessing.Queue()       # 从数据库里取出来的需要爬取的url等信息
    result_data_queue = multiprocessing.Queue()     # 爬取的结果
    wait_to_insert_queue = multiprocessing.Queue()  # 等待写入数据库的数据 已经去重 符合insert的格式要求

    p1 = multiprocessing.Process(target=get_remote_data, args=(init_data_queue, wait_to_insert_queue), name='[数据库交互进程]')
    p2 = multiprocessing.Process(target=scrapy_wechat, args=(init_data_queue, result_data_queue), name='[爬虫进程]')
    p3 = multiprocessing.Process(target=make_data, args=(result_data_queue, wait_to_insert_queue), name='[数据处理进程]')
    try:
        p1.start()
        p2.start()
        p3.start()
    except Exception as e:
        print(f"{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())} - [主进程] - 错误信息: {e}")

当程序被打包为EXE文件后,启动时会出现疯狂创建子进程的现象,程序会反复在if WORKERS > 0:这行代码处执行,导致无法正常工作,甚至使电脑逐渐卡死。解决方法是在程序入口前加入multiprocessing.freeze_support()即可解决该问题。需要注意的是,该语句必须写在if __name__ == "__main__"的下一句,如果没有main语句,也会出错。

到此这篇关于python多进程程序打包成exe的问题的文章就介绍到这了,更多相关python打包成exe内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表