首頁 >後端開發 >Python教學 >詳解python中Threadpool執行緒池任務終止範例程式碼

詳解python中Threadpool執行緒池任務終止範例程式碼

高洛峰
高洛峰原創
2017-03-20 13:09:564221瀏覽

需求

加入我們需要處理一串個位數(0~9),奇數時需要循環列印它;偶數則等待對應時長並完成所有任務;0則是錯誤,但不需要終止任務,可以自訂一些處理。

關鍵點

定義func函數處理需求

callback處理回傳結果,只有偶數和0回傳;奇數會一直執行;要控制執行緒池狀態,則需要針對偶數和0時拋出異常,並捕獲異常處理

threadpool定義執行緒池並發

實作

# -*- coding: utf-8 -*-
from threadpool import makeRequests, ThreadPool
import time
from multiprocessing import Process

例外定義與特殊值(0)定義

class Finish(SyntaxWarning):
    pass
class PauseInfo(SyntaxWarning):
    pass
pause_num = 0

func函數定義

# 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)

callback定義

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn