python 多进程代码问题以及用 pyinstaller 打包成exe 问题解决
python 多进程运行报错concurrent.futures.process.BrokenProcessPool: A process in the process pool was terminated abruptly while the future was running or pending.
#! /usr/bin/env python
# -*- coding: utf-8 -*-#
# -------------------------------------------------------------------------------
# Name: demo
# Author: yunhgu
# Date: 2021/6/25 13:41
# Description:
# -------------------------------------------------------------------------------
from concurrent.futures import ProcessPoolExecutor, as_completed
import time
import multiprocessing
import os
def job(jobid):
print(f"start job {jobid} time:{time.time()} id:{os.getpid()}")
time.sleep(2)
print(f"{jobid} finished")
return "success"
multiprocessing.freeze_support()
with ProcessPoolExecutor(max_workers=4) as p:
task_list = [p.submit(job, job_id) for job_id in range(5)]
for task in as_completed(task_list):
if task.done():
print(task.result())
需要添加main
#! /usr/bin/env python
# -*- coding: utf-8 -*-#
# -------------------------------------------------------------------------------
# Name: demo
# Author: yunhgu
# Date: 2021/6/25 13:41
# Description:
# -------------------------------------------------------------------------------
from concurrent.futures import ProcessPoolExecutor, as_completed
import time
import multiprocessing
import os
def job(jobid):
print(f"start job {jobid} time:{time.time()} id:{os.getpid()}")
time.sleep(2)
print(f"{jobid} finished")
return "success"
if __name__ == '__main__':
multiprocessing.freeze_support()
with ProcessPoolExecutor(max_workers=4) as p:
task_list = [p.submit(job, job_id) for job_id in range(5)]
for task in as_completed(task_list):
if task.done():
print(task.result())
使用pyinstaller 打包成exe
对于pyinstaller 是不支持含有多进程的python打包,打包完毕后,不会执行子进程的内容,而是会一直创建进程,导致崩溃
解决方法:
multiprocessing.freeze_support()
这句话一定要放在main下的第一行,如下所示
#! /usr/bin/env python
# -*- coding: utf-8 -*-#
# -------------------------------------------------------------------------------
# Name: demo
# Author: yunhgu
# Date: 2021/6/25 13:41
# Description:
# -------------------------------------------------------------------------------
from concurrent.futures import ProcessPoolExecutor, as_completed
import time
import multiprocessing
import os
def job(jobid):
print(f"start job {jobid} time:{time.time()} id:{os.getpid()}")
time.sleep(2)
print(f"{jobid} finished")
return "success"
if __name__ == '__main__':
multiprocessing.freeze_support()
with ProcessPoolExecutor(max_workers=4) as p:
task_list = [p.submit(job, job_id) for job_id in range(5)]
for task in as_completed(task_list):
if task.done():
print(task.result())
然后就可以正常运行了
不论你在什么时候开始,重要的是开始之后就不要停止。
不论你在什么时候结束,重要的是结束之后就不要悔恨。