ThreadPool的使用
驚帆之靜默 ? Blog Archive ? ThreadPool的使用
ThreadPool的使用
?
ThreadPool的使用
| gashero |
?
目錄
- 1???簡介
- 2???簡單的使用
- 3???接口文檔
- 4???ThreadPool的遞歸任務(wù)管理問題
- 5???回調(diào)函數(shù)的使用
- 5.1???使用 sys.exc_info() 信息
?
1???簡介
Nicky介紹給我使用的,其接口與其他很多線程池包裝都差不多,不過因?yàn)橹挥幸粋€(gè)模塊,比較容易附帶在程序中,所以研究下。 python threadpool 據(jù)介紹代碼來自《Python in a Nutshell》的14.5節(jié)。
?
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)
創(chuàng)建多個(gè)計(jì)算請(qǐng)求,并允許有不同的參數(shù)。
參數(shù)列表中的每一個(gè)元素是兩個(gè)元素的元組,分別是位置參數(shù)列表和關(guān)鍵字參數(shù)字典。
class ThreadPool
線程池類,發(fā)布工作請(qǐng)求并收集結(jié)果。
__init__(self,num_workers,q_size)
構(gòu)造函數(shù),設(shè)置線程池工作線程數(shù)量和最大任務(wù)隊(duì)列長度。 num_workers 是初始化時(shí)的線程數(shù)量。如果 q_size>0 則會(huì)限制工作隊(duì)列的長度,并且在工作隊(duì)列滿時(shí)阻塞繼續(xù)插入工作請(qǐng)求的任務(wù)。
createWorkers(self,num_workers)
增加工作線程數(shù)量。
dismissWorkers(self,num_workers)
減少工作線程數(shù)量。
pool(self,block)
處理隊(duì)列中的新結(jié)果。也就是循環(huán)的調(diào)用各個(gè)線程結(jié)果中的回調(diào)和錯(cuò)誤回調(diào)。不過,當(dāng)請(qǐng)求隊(duì)列為空時(shí)會(huì)拋出 NoResultPending 異常,以表示所有的結(jié)果都處理完了。這個(gè)特點(diǎn)對(duì)于依賴線程執(zhí)行結(jié)果繼續(xù)加入請(qǐng)求隊(duì)列的方式不太適合。
putRequest(self,request,block=True,timeout=0)
加入一個(gè)任務(wù)請(qǐng)求到工作隊(duì)列。
wait(self)
等待執(zhí)行結(jié)果,直到所有任務(wù)完成。
class WorkerThread
工作者線程,供ThreadPool內(nèi)部使用,不必關(guān)注。其自定義方法也只有一個(gè)。
class WorkRequest
任務(wù)請(qǐng)求類。
__init__(self,callable,args=None,kwds=None,requestID=None,callback=None,exc_callback=None)
創(chuàng)建一個(gè)工作請(qǐng)求。
?
4???ThreadPool的遞歸任務(wù)管理問題
如果ThreadPool執(zhí)行的任務(wù)中還會(huì)添加任務(wù)則需要多考慮幾個(gè)問題。
如果一個(gè)這樣的任務(wù)正在運(yùn)行,尚未完成時(shí)任務(wù)列表就已經(jīng)空了,那么ThreadPool會(huì)立即拋出 NoResultsPending 異常,以告知 wait() 方法所有任務(wù)都完成了。而事實(shí)上,還有一個(gè)線程尚未執(zhí)行完成。
這種情況下,可以自己設(shè)置一個(gè)退出條件自己重新實(shí)現(xiàn) wait() 方法。在循環(huán)中調(diào)用 poll(True) 方法。對(duì)于拋出的 NoResultsPending 異常視而不見。并自己設(shè)置循環(huán)的退出方法。
?
5???回調(diào)函數(shù)的使用
建立任務(wù)請(qǐng)求時(shí)有兩種回調(diào)函數(shù) callback 和 exc_callback ,他們的回調(diào)接口為:
callback(request,result)exc_callback(request,sys.exc_info())其中 request 為 WorkRequest 對(duì)象。而 result 則是調(diào)用線程函數(shù)正確的返回結(jié)果。 sys.exc_info() 為發(fā)生異常時(shí)返回的信息。 sys.exc_info() 是一個(gè)擁有3個(gè)元素的元組。分別為:
- 異常類 :發(fā)生異常的類
- 異常實(shí)例 :如上異常類的實(shí)例,包含更多詳細(xì)信息
- 跟蹤信息 :traceback對(duì)象,可以顯示錯(cuò)誤的行號(hào)等等具體的錯(cuò)誤信息
?
Warning
注意,如果沒有設(shè)置 exc_callback 則發(fā)生異常時(shí)會(huì)將異常信息寫入 callback 回調(diào)函數(shù)。如果同時(shí)沒有設(shè)置 callback 和 exc_callback 則發(fā)生任何異常都不會(huì)有提示,根本無法調(diào)試。
?
5.1???使用 sys.exc_info() 信息
由于發(fā)生異常時(shí)返回的 sys.exc_info() 內(nèi)容并不易讀,所以可以用如下方式定制錯(cuò)誤回調(diào)函數(shù),將錯(cuò)誤信息打印出來,或者可選的輸出到日志文件。
import traceback def exc_callback(excinfo):errorstr=''.join(traceback.format_exception(*excinfo))print errorstr這樣的顯示結(jié)果就如同控制臺(tái)中看到的錯(cuò)誤跟蹤一樣了。
總結(jié)
以上是生活随笔為你收集整理的ThreadPool的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET中颜色的转换方法总结
- 下一篇: SameNameFile 比较两个文件夹