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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ThreadPool的使用

發布時間:2024/4/11 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ThreadPool的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

驚帆之靜默 ? Blog Archive ? ThreadPool的使用

ThreadPool的使用

?

ThreadPool的使用

筆記:
gashero

?

目錄

  • 1???簡介
  • 2???簡單的使用
  • 3???接口文檔
  • 4???ThreadPool的遞歸任務管理問題
  • 5???回調函數的使用
    • 5.1???使用 sys.exc_info() 信息

?

1???簡介

Nicky介紹給我使用的,其接口與其他很多線程池包裝都差不多,不過因為只有一個模塊,比較容易附帶在程序中,所以研究下。 python threadpool 據介紹代碼來自《Python in a Nutshell》的14.5節。

?

2???簡單的使用

代碼中給出的例子:

>>> pool=ThreadPool(poolsize) >>> requests=makeRequests(some_callable,list_of_args,callback) >>> [pool.putRequest(req) for req in requests >>> pool.wait()

可見使用步驟如下:

  • 建立線程池對象,其實是個線程管理器
  • 建立計算任務對象Request
  • 將計算任務對象放入線程池當中
  • 等待計算完成
  • ?

    3???接口文檔

    英文見 http://chrisarndt.de/en/software/python/threadpool/api/ 。

    makeRequests(callable,args_list,callback=None,exc_callback=None)

    創建多個計算請求,并允許有不同的參數。

    參數列表中的每一個元素是兩個元素的元組,分別是位置參數列表和關鍵字參數字典。

    class ThreadPool

    線程池類,發布工作請求并收集結果。

    __init__(self,num_workers,q_size)

    構造函數,設置線程池工作線程數量和最大任務隊列長度。 num_workers 是初始化時的線程數量。如果 q_size>0 則會限制工作隊列的長度,并且在工作隊列滿時阻塞繼續插入工作請求的任務。

    createWorkers(self,num_workers)

    增加工作線程數量。

    dismissWorkers(self,num_workers)

    減少工作線程數量。

    pool(self,block)

    處理隊列中的新結果。也就是循環的調用各個線程結果中的回調和錯誤回調。不過,當請求隊列為空時會拋出 NoResultPending 異常,以表示所有的結果都處理完了。這個特點對于依賴線程執行結果繼續加入請求隊列的方式不太適合。

    putRequest(self,request,block=True,timeout=0)

    加入一個任務請求到工作隊列。

    wait(self)

    等待執行結果,直到所有任務完成。

    class WorkerThread

    工作者線程,供ThreadPool內部使用,不必關注。其自定義方法也只有一個。

    class WorkRequest

    任務請求類。

    __init__(self,callable,args=None,kwds=None,requestID=None,callback=None,exc_callback=None)

    創建一個工作請求。

    ?

    4???ThreadPool的遞歸任務管理問題

    如果ThreadPool執行的任務中還會添加任務則需要多考慮幾個問題。

    如果一個這樣的任務正在運行,尚未完成時任務列表就已經空了,那么ThreadPool會立即拋出 NoResultsPending 異常,以告知 wait() 方法所有任務都完成了。而事實上,還有一個線程尚未執行完成。

    這種情況下,可以自己設置一個退出條件自己重新實現 wait() 方法。在循環中調用 poll(True) 方法。對于拋出的 NoResultsPending 異常視而不見。并自己設置循環的退出方法。

    ?

    5???回調函數的使用

    建立任務請求時有兩種回調函數 callback 和 exc_callback ,他們的回調接口為:

    callback(request,result)exc_callback(request,sys.exc_info())

    其中 request 為 WorkRequest 對象。而 result 則是調用線程函數正確的返回結果。 sys.exc_info() 為發生異常時返回的信息。 sys.exc_info() 是一個擁有3個元素的元組。分別為:

    • 異常類 :發生異常的類
    • 異常實例 :如上異常類的實例,包含更多詳細信息
    • 跟蹤信息 :traceback對象,可以顯示錯誤的行號等等具體的錯誤信息

    ?

    Warning

    注意,如果沒有設置 exc_callback 則發生異常時會將異常信息寫入 callback 回調函數。如果同時沒有設置 callback 和 exc_callback 則發生任何異常都不會有提示,根本無法調試。

    ?

    5.1???使用 sys.exc_info() 信息

    由于發生異常時返回的 sys.exc_info() 內容并不易讀,所以可以用如下方式定制錯誤回調函數,將錯誤信息打印出來,或者可選的輸出到日志文件。

    import traceback def exc_callback(excinfo):errorstr=''.join(traceback.format_exception(*excinfo))print errorstr

    這樣的顯示結果就如同控制臺中看到的錯誤跟蹤一樣了。

    總結

    以上是生活随笔為你收集整理的ThreadPool的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

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