日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python主进程 子进程_pool主进程捕获子进程异常

發布時間:2024/10/8 python 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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主进程捕获子进程异常的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。