Python 多进程异常处理的方法,你会吗
最近项目用到了Python作为网站的前端,使用的框架是基于线程池的Cherrypy,但是前端依然有一些比较‘重’的模块。由于python的多线程无法很好的利用多核的性质,所以觉得把这些比较‘重’的功能用多进程进行管理。
Python 多进程编程
Python的多进程编程主要依赖multiprocessing库,父进程的参数直接拷贝给子进程,因为Linux进程的copy on write特性,如果子进程不对参数进行修改就不会进行拷贝工作,也就是说父进程,子进程共享参数。而参数的返回则通过管道pipe进行。
下面是简单的代码例子:
import multiprocessingdef heavy_load_func(N, child_conn):'''function do heavy computing'''try:#do_some_heavy_computingchild_conn.send(return_value) #return somethingexcept Exception,e:child_conn.send(e) #将异常通过管道送出if __name__=='__main__''''main function'''try:parent_conn, child_conn = multiprocessing.Pipe()hild_process = multiprocessing.Process(target=heavy_load_func, args=(10, child_conn))child_process.start()child_process.join()child_return = parent_conn.recv()print child_returnexcept Exception,e:logger.error(e)
多进程异常处理
但是如果heavy_load_func在执行过程中抛出异常就比较麻烦了,当然我们可以通过Pipe将捕捉到的异常信息传到父进程,但是这样父进程只是得到了一条返回值,并没有触发父进程的异常机制,如何把子进程的异常抛出给父进程进行处理呢?
本文提供一种方法,通过引入一个代理类Process对multiprocessing.Process进行重载,Process中重写multiprocessing.Process的run方法,并且加入exception属性,通过exception来判断子进程是否触发异常。
class Process(multiprocessing.Process):def __init__(self, *args, **kwargs):multiprocessing.Process.__init__(self, *args, **kwargs)self._pconn, self._cconn = multiprocessing.Pipe()self._exception = Nonedef run(self):try:multiprocessing.Process.run(self)self._cconn.send(None)except Exception as e:tb = traceback.format_exc()self._cconn.send((e, tb))@propertydef exception(self):if self._pconn.poll():self._exception = self._pconn.recv()return self._exception
这样我们的代码就可以写成这样:
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:725638078
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
if __name__=='__main__':'''main function'''try:parent_conn, child_conn = multiprocessing.Pipe()#child_process = multiprocessing.Process(target=heavy_load_func, args=(10, child_conn))child_process = Process(target=heavy_load_func, args=(10, child_conn))child_process.start()child_process.join()if child_process.exception:error, traceback = child_process.exceptionprint errorchild_process.terminate()else:child_return = parent_conn.recv() #如果不子进程不抛出异常就接受值,否则主进程退出,避免主进程被管道阻塞!print child_returnexcept Exception, e:print e
总结
本文主要介绍了一种Python多进程异常处理的方法,通过引入代理类来进行异常的转发。文章介绍的比较简单,其实里面有很多东西。
Python 多进程异常处理的方法,你会吗相关推荐
- python 多进程异常处理
前言 最近项目用到了Python作为网站的前端,使用的框架是基于线程池的Cherrypy,但是前端依然有一些比较'重'的模块.由于python的多线程无法很好的利用多核的性质,所以觉得把这些比较'重' ...
- python多进程的使用方法
多进程的使用方法,如图所示: p = pool.Pool()process_num = 10 divide = 1/process_numfor i in range(process_num):p.a ...
- Python 多进程pool.map()方法的使用
在python中,只有多进程才可以充分利用CPU的资源,适合CPU计算型任务,其他的就不多说了.这里介绍一个 pool.map()方法,很实用! pool.map() 先直接上代码: import t ...
- python爬虫网络请求超时_python总urllib,伪装,超时设置,异常处理的方法
python爬虫之urllib,伪装,超时设置,异常处理的方法 Urllib 1. Urllib.request.urlopen().read().decode() 返回一个二进制的对象,对这个对象进 ...
- Python多进程及多参数的处理方法
一.多进程pool.map()方法一 import time from multiprocessing.pool import Pooldef numsCheng(i):return i * 2if ...
- 最简单方法远程调试Python多进程子程序
Python 2.6新增的multiprocessing,即多进程,给子进程代码调试有点困难,比如python自带的pdb如果直接在子进程代码里面启动会抛出一堆异常,原因是子进程的stdin/out/ ...
- 提升Python程序运行效率的方法总结
使用Python中的timeit函数测试程序运行效率: def timeit(stmt="pass", setup="pass", timer=<buil ...
- python多进程详解
目录 python多进程 序.multiprocessing 一.Process process介绍 例1.1:创建函数并将其作为单个进程 例1.2:创建函数并将其作为多个进程 例1.3:将进程定义为 ...
- Python 多进程开发与多线程开发
我们先来了解什么是进程? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程 ...
最新文章
- python 通过双栈实现队列
- java三级考试_java web 学习 --第五天(Java三级考试)
- 笔记本电脑可以安装python吗-笔记本怎样安装Python64位的?
- docker 训练深度学习_利用RGB图像训练MultiModality的深度学习模型进行图像分割
- 20应用统计考研复试要点(part14)--应用多元分析
- 微软提出Layout,多模态任务也有预训练模型啦
- 对二宝软件的NABCD分析
- 手机html5跑分,吊炸天的Chrome55内核来袭 360手机浏览器成“跑分王”
- 李春葆《数据结构教程》课后习题和实验代码
- 动力节点『lol版』Java学习路线图(四)Javaweb阶段
- ArcEngine代码 浏览器端图形JSON与后端IGeometry相互转换
- php代码托管平台,程序员必须知道的几个Git代码托管平台
- HTML5仿苹果Siri动画js特效
- 湖南大学基于SMTP和POP3的邮件系统课程设计
- 计算机教学能力提升体会,学习《信息技术助力教学能力提高》感悟
- PTA-L1-088 静静的推荐(C++)
- fan_in / fan_out 的理解
- 记一次海康威视的面试经历
- SwfitUI之Published
- ups计算软件_什么是UPS?为什么要用UPS?