问题背景:

主进程做任务调度,子进程做任务执行,子进程定时返回进度信息,主进程获取进度,进度为100时,子进程任务结束。子进程执行过程中如果有异常,主进程需要捕获

python多进程调度, 主进程如何捕获子进程的异常,这个问题困扰了好久,网上看了好多方法都不是我想要的,整理了一下遇到的一些坑

为了简化子进程任务实现,和主进程的任务等待的过程,直接用time.sleep(),先看下最终实现方案:

from multiprocessing import Pool

import time

def sub_task():

print "sub_task():enter sub_task"

loop_num = 0

while True:

print "sub_task:enter sub process loop"

if loop_num > 1:

print 'sub_task():sub_task finish'

raise Exception("sub_task has error")

loop_num += 1

time.sleep(1)

if __name__ == "__main__":

try:

proc_pool = Pool(processes=6)

result = proc_pool.apply_async(sub_task, args=())

proc_pool.close()

count = 0

while True:

print "main():enter main process loop"

time.sleep(2)

if result.ready():

print 'main():sub process is finish'

result.get()

if count > 1:

break

count += 1

print "main():main process finish"

except Exception as err_msg:

print "main():error mesage=%s" % str(err_msg)

proc_pool.terminate()

有异常的执行结果:

执行结果

子进程每隔一秒打印一次,打印2次后退出,主进程每隔1秒判断一次,当子进程执行完完是获取结果,如果有异常调到except直接捕获打印出来,没有异常执行打印语句(把子进程的异常删除或者把主进程循环时间改小或者把循环次数改小),主进程退出

没有异常的执行结果:

执行结果

遇到的坑:

在子进程中添加一个try-except:子进程能捕获自己的异常,不能反馈到主进程中

def sub_task():

try:

print "sub_task():enter sub_task"

loop_num = 0

while True:

print "sub_task:enter sub process loop"

if loop_num > 1:

print 'sub_task():sub_task finish'

raise Exception("sub_task has error")

loop_num += 1

time.sleep(1)

except Exception as err_msg:

print "sub_task():error mesage=%s" % str(err_msg)

执行结果

在主进程中直接增加result.get(),这样做主进程一直会等待子进程结束,主进程循环只能进去一次

if __name__ == "__main__":

try:

proc_pool = Pool(processes=6)

result = proc_pool.apply_async(sub_task, args=())

proc_pool.close()

count = 0

while True:

print "main():enter main process loop"

time.sleep(0.3)

result.get()

if count > 1:

break

count += 1

print "main():main process finish"

except Exception as err_msg:

print "main():error mesage=%s" % str(err_msg)

proc_pool.terminate()

执行结果

python主进程 子进程_pool主进程捕获子进程异常相关推荐

  1. python输出变量的值使用_Python捕获任何异常,并使用变量值打印或记录回溯

    当我用sys.excepthook捕获意外错误时 import sys import traceback def handleException(excType,excValue,trace): pr ...

  2. 主进程、子进程和守护进程

    理解 主进程main thread: 程序执行的入口,可以理解为常用的main 函数. 父进程parent thread: 对于子进程而言, 子进程的创造者,可有多个子进程. 任何进程都有父进程,追根 ...

  3. Python Process类开启多层级进程杀不死问题解决(从父进程杀死子进程)

    Python Process类开启多层级进程杀不死问题 问题描述 问题分析 解决方案 问题描述 在使用python multiprocess包下的Process打开子进程,并在打开的子进程中再打开一个 ...

  4. 进程相关(进程Id获取主窗口)

    1.知道进程handle 获取进程名称. PROCESS_INFORMATION* processInfo =(PROCESS_INFORMATION*)pid();    HANDLE hProce ...

  5. electron 主进程,和渲染进程的通信

    ipcMain https://electronjs.org/docs/api/ipc-main 当在主进程中使用时,它处理从渲染器进程(网页)发送出来的异步和同步信息, 当然也有可能从主进程向渲染进 ...

  6. 【python】通过信号机制对子进程进行控制

    在python中,使用多进程可以绕过GIL的限制从而充分利用多核CPU来加速任务.但如果对进程处理不当,就容易造成僵尸进程或孤儿进程,从而造成系统资源的浪费. 本文分析了在python中可能会生成这两 ...

  7. Python 多进程笔记 — 启动进程的方式、守护进程、进程间通信、进程池、进程池之间通信、多进程生产消费模型

    1 面向过程启动多进程 Python 操作进程的类都定义在 multiprocessing 模块,该模块提供了一个 Process 类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另 ...

  8. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自 Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mul ...

  9. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

最新文章

  1. matlab 数学库,matlab数学函数库
  2. Laravel 系列入门教程(一)【最适合中国人的 Laravel 教程】
  3. 深度学习核心技术精讲100篇(六)-keras 实战系列之知识蒸馏(Knowledge Distilling)
  4. paper 17 : 机器学习算法思想简单梳理
  5. 5920. 分配给商店的最多商品的最小值
  6. android 回车键事件编程
  7. 对于超平面的理解[转载]
  8. 计算机控制试压,试压泵计算机控制系统电脑控制试压泵自动记录功能
  9. java生成pdf417条形码_python生成417条形码(PDF417)
  10. ams1117 lm317 对比_ams1117中文资料汇总(ams1117引脚图及功能_工作原理及典型应用电路)...
  11. 模拟滑动窗口协议算法C语言,滑动窗口协议模拟程序.docx
  12. Windows 7可以拯救微软Netbook市场
  13. 建模教程_Zbrush沼泽猎人角色制作教程
  14. 台达服务器电源性能怎么样,台达电源怎么样?该怎么选择台达电源?
  15. IOS APP开发:苹果app从开发到上架教程详解
  16. 高级计算机网络考试复习
  17. kal linux 刻录光盘,kali linux安装之旅
  18. linux的cuda10卸载,Ubuntu18.04下卸载CUDA11.0
  19. 计算机农业类的sci,农林类容易录用的sci期刊有哪些?
  20. Android检测手机锁屏开屏事件

热门文章

  1. 【软考-软件设计师】编译程序基本原理
  2. Scala高阶函数详解
  3. Apache Shiro权限控制框架简介
  4. ElasticSearch各种查询对象Query的使用
  5. Undefined function or method ' ' for input arguments of type 'double' ---错误解决办法
  6. C语言各种变量的初始化
  7. git / 如何将其他分支的某些 commit 合并到当前分支中?
  8. 求最大素数的c语言,for语句计算输出10000以内最大素数怎么搞最简单??各位大神们...
  9. 卡方 python_卡方优度检测 (Python 实现) --基于jupyter
  10. java匿名内部类runnable_Java内部类:匿名内部类(四)