python主进程 子进程_pool主进程捕获子进程异常
問題背景:
主進程做任務調度,子進程做任務執行,子進程定時返回進度信息,主進程獲取進度,進度為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主进程捕获子进程异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python r语言 结合 部署_(转)
- 下一篇: java 删除二进制内容_从二进制矩阵中