加入我們需要處理一串個位數(0~9),奇數時需要循環列印它;偶數則等待對應時長並完成所有任務;0則是錯誤,但不需要終止任務,可以自訂一些處理。
定義func函數處理需求
callback處理回傳結果,只有偶數和0回傳;奇數會一直執行;要控制執行緒池狀態,則需要針對偶數和0時拋出異常,並捕獲異常處理。
threadpool定義執行緒池並發
# -*- coding: utf-8 -*- from threadpool import makeRequests, ThreadPool import time from multiprocessing import Process
class Finish(SyntaxWarning): pass
class PauseInfo(SyntaxWarning): pass pause_num = 0
# 0時傳回False,其他偶數傳回True
def func(para): if para == pause_num: print('start for %d and wait %ds' % (para, 4)) time.sleep(4) print('error bcs ',para) return False if para % 2 == 0: print('start for %d and wait %ds' % (para, para)) time.sleep(para) print('stop for', para) return True while True: print('continue for', para) time.sleep(para)
def callback(request, result): if result: raise Finish else: raise PauseInfo
Finish標識任務完成,再次誘發異常退出執行緒池處理;
def main_thread(paras): pool = ThreadPool(10) requests = makeRequests(callable_=func, args_list=paras, callback=callback) [pool.putRequest(req) for req in requests] while True: try: pool.wait() except Finish as e: raise SystemExit except PauseInfo as e: print('Pause bcs %d but will continue' % pause_num) except Exception as e: print('Unknown error so will quit') raise SystemExit
if name == 'main': while True: s = input('Input number list to test and any other word to quit\n') paras = [] for para in s: if para.isnumeric(): paras.append(int(para)) else: break try: thread_test = Process(target=main_thread, args=(paras,)) thread_test.start() thread_test.join(timeout=20) except TimeoutError as e: print('task timeout') except Exception as e: print('unknow error:',e)
#處理108,看列印可以看到,1被循環處理,0處理的時候報錯;8處理完畢則任務結束
Input number list to test and any other word to quit
108
continue for 1
start for 0 and wait 4s
start for 8 and wait 8s
continue for 1
continue for 1
continue for 1
error bcs 0
continue for 1
Pause bcs 0 will continue
continue for 1
continue for 1
continue for 1
continue for 1
stop for 8
Input number list to test and any other word to quit
以上是詳解python中Threadpool執行緒池任務終止範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!