需求
加入我們需要處理一串個位數(0~9),奇數時需要循環列印它;偶數則等待對應時長並完成所有任務;0則是錯誤,但不需要終止任務,可以自訂一些處理。
關鍵點
定義func函數處理需求
callback處理回傳結果,只有偶數和0回傳;奇數會一直執行;要控制執行緒池狀態,則需要針對偶數和0時拋出異常,並捕獲異常處理。
threadpool定義執行緒池並發
實作
1 2 3 4 | # -*- coding: utf-8 -*-
from threadpool import makeRequests, ThreadPool
import time
from multiprocessing import Process
|
登入後複製
例外定義與特殊值(0)定義
1 2 | class Finish(SyntaxWarning):
pass
|
登入後複製
1 2 3 | class PauseInfo(SyntaxWarning):
pass
pause_num = 0
|
登入後複製
func函數定義
# 0時傳回False,其他偶數傳回True
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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)
|
登入後複製
callback定義
1 2 3 4 5 | def callback(request, result):
if result:
raise Finish
else :
raise PauseInfo
|
登入後複製
執行緒池處理
Finish標識任務完成,再次誘發異常退出執行緒池處理;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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
|
登入後複製
主函數起一個測試進程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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中文網其他相關文章!