mulitprocessing模块在window环境下使用有诸多限制,需要注意,其中之一就是在main.py下使用multiprocessing启动子进程问题:
该问题在pycharm中没有,pycharm环境下运行调试都是正常的,当使用pyinstaller打包为exe文件时,双击exe文件运行,会进入无限创建进程的死循环,最终导致系统崩溃,所有cpu跑满。
导致该问题的根本原因是:windows环境下python通过启动进程创建子进程时,子进程启动会导入父进程的py文件,运行父进程的创建子进程代码导致陷入无限循环(这只是windows下出现的问题的一种形式,还有其他形式, 官文上说叫导入主模块产生的副作用,)
针对该情况,multiprocessing提供了freeze_support来实现main module的安全导入,在运行multiprocessing创建进程前调用该方法:
....
if __name__ == '__main__':
import multiprocessing
# 该方法作用是阻止子进程运行其后面的代码
multiprocessing.freeze_support()
pool = Pool(3)
try:
log.info("Start Program.")
pool.apply_async(start_queue_manager, error_callback=error_callback)
pool.apply_async(start_server, error_callback=error_callback).ready()
pool.apply_async(start_browser, error_callback=error_callback)
except:
log.error(traceback.format_exc())
finally:
pool.close()
pool.join()