首页 > 编程语言 > 详细

python多进程中的异常捕获

时间:2020-04-03 16:58:20      阅读:286      评论:0      收藏:0      [点我收藏+]

在正常的python多进程中,父进程只负责将任务分发给子进程,子进程成功与否,父进程并不关心.

但是在生产环境中,这种显然是不恰当的.通过研究我发现通过回调方法可以获取子进程的状态,然后通过一个queue将失败的子进程标记出来,就可以实现失败进程的重试,代码如下:

import queue
import random
import time
from multiprocessing import Pool

q = queue.Queue()
success_count = 0

#实际运行的task方法
def long_time_task(table_name):
    rd = random.randint(1, 10)
  #任务失败抛出异常,抛出的就是任务名称,在回调方法中可以捕获
if rd % 2 == 0: raise Exception(table_name) global q print(ok=%s % table_name) time.sleep(1) #成功任务计数 def success(suc): global success_count success_count = success_count + 1 #失败任务捕获 def err(error): q.put(error) if __name__ == __main__:
  #初始化一个4个槽位线程池 p
= Pool(4) lists = [table_ + str(i) for i in range(1, 21)] lists_num=len(lists)
  #将任务放入队列
for i in lists: q.put(i)
  #队列为空不一定就是所有任务完成了,可能还有在运行中的任务,所以需要两个条件满足才能退出循环
while not q.empty() or success_count!=lists_num: if q.empty(): time.sleep(1) else: p.apply_async(long_time_task, args=(q.get(),), callback=success, error_callback=err) p.close() p.join() print(q.size=%d,success_count=%d % (q.qsize(), success_count))

 

python多进程中的异常捕获

原文:https://www.cnblogs.com/wangbin2188/p/12627365.html

(1)
(1)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!