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()可見使用步驟如下:
?
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的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET中颜色的转换方法总结
- 下一篇: SameNameFile 比较两个文件夹