最近项目用到了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 多进程异常处理的方法,你会吗相关推荐

  1. python 多进程异常处理

    前言 最近项目用到了Python作为网站的前端,使用的框架是基于线程池的Cherrypy,但是前端依然有一些比较'重'的模块.由于python的多线程无法很好的利用多核的性质,所以觉得把这些比较'重' ...

  2. python多进程的使用方法

    多进程的使用方法,如图所示: p = pool.Pool()process_num = 10 divide = 1/process_numfor i in range(process_num):p.a ...

  3. Python 多进程pool.map()方法的使用

    在python中,只有多进程才可以充分利用CPU的资源,适合CPU计算型任务,其他的就不多说了.这里介绍一个 pool.map()方法,很实用! pool.map() 先直接上代码: import t ...

  4. python爬虫网络请求超时_python总urllib,伪装,超时设置,异常处理的方法

    python爬虫之urllib,伪装,超时设置,异常处理的方法 Urllib 1. Urllib.request.urlopen().read().decode() 返回一个二进制的对象,对这个对象进 ...

  5. Python多进程及多参数的处理方法

    一.多进程pool.map()方法一 import time from multiprocessing.pool import Pooldef numsCheng(i):return i * 2if ...

  6. 最简单方法远程调试Python多进程子程序

    Python 2.6新增的multiprocessing,即多进程,给子进程代码调试有点困难,比如python自带的pdb如果直接在子进程代码里面启动会抛出一堆异常,原因是子进程的stdin/out/ ...

  7. 提升Python程序运行效率的方法总结

    使用Python中的timeit函数测试程序运行效率: def timeit(stmt="pass", setup="pass", timer=<buil ...

  8. python多进程详解

    目录 python多进程 序.multiprocessing 一.Process process介绍 例1.1:创建函数并将其作为单个进程 例1.2:创建函数并将其作为多个进程 例1.3:将进程定义为 ...

  9. Python 多进程开发与多线程开发

    我们先来了解什么是进程? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程 ...

最新文章

  1. python 通过双栈实现队列
  2. java三级考试_java web 学习 --第五天(Java三级考试)
  3. 笔记本电脑可以安装python吗-笔记本怎样安装Python64位的?
  4. docker 训练深度学习_利用RGB图像训练MultiModality的深度学习模型进行图像分割
  5. 20应用统计考研复试要点(part14)--应用多元分析
  6. 微软提出Layout,多模态任务也有预训练模型啦
  7. 对二宝软件的NABCD分析
  8. 手机html5跑分,吊炸天的Chrome55内核来袭 360手机浏览器成“跑分王”
  9. 李春葆《数据结构教程》课后习题和实验代码
  10. 动力节点『lol版』Java学习路线图(四)Javaweb阶段
  11. ArcEngine代码 浏览器端图形JSON与后端IGeometry相互转换
  12. php代码托管平台,程序员必须知道的几个Git代码托管平台
  13. HTML5仿苹果Siri动画js特效
  14. 湖南大学基于SMTP和POP3的邮件系统课程设计
  15. 计算机教学能力提升体会,学习《信息技术助力教学能力提高》感悟
  16. PTA-L1-088 静静的推荐(C++)
  17. fan_in / fan_out 的理解
  18. 记一次海康威视的面试经历
  19. SwfitUI之Published
  20. ups计算软件_什么是UPS?为什么要用UPS?

热门文章

  1. 利用 GitHub 搭建独立 Web 网站
  2. 函数的方法call、apply、bind
  3. spring计算方圆300km内其它城市(附完整代码)
  4. 浅谈软件性能测试中关键指标的监控与分析(转)
  5. MapReduce 计数器简介
  6. 转:vc中如何通过http的post方式上传文件
  7. linux系统加硬盘容量,Linux系统扩展硬盘空间
  8. 韦恩图——帮助你更好地表达多个数据集合之间的相交关系
  9. Message LongText(消息的详细长文本)
  10. 查看移动平均价的历史记录