程序,執行緒與執行緒池(1)

2021-07-31 13:05:16 字數 2072 閱讀 2071

傳統方法:建立乙個新的執行緒,由該執行緒執行任務,任務執行完畢後執行緒退出——即時建立,即時銷毀

如果提交給執行緒的任務是執行時間較短,執行次數頻繁,那麼不斷銷毀和不斷建立的開銷則是不可忽略的。

執行緒池採用預建立技術,在應用程式啟動之後,立即建立一定數量的執行緒,放入空閒佇列中,這些執行緒處於阻塞狀態,不消耗cpu,占用較小的記憶體。當任務到來。緩衝池選擇乙個空閒執行緒,把任務傳入此執行緒中執行,當以建立的執行緒都在處理任務時,緩衝池自動建立一定數量的新執行緒,用於處理更多的任務。任務執行完畢後,執行緒不退出,而是繼續在池中等待下一次任務。當系統比較空閒時,大部分執行緒處於阻塞狀態,執行緒池自動銷毀一部分執行緒,**系統資源。這樣執行緒建立和銷毀的開銷分到了多個任務上,執行次數越多,每個任務所分擔到的執行緒本身的開銷越小。

執行緒到任務佇列裡面取任務,執行完成後通知系統,然後繼續去佇列中取下乙個任務,直至任務佇列取空,退出執行緒。

一般執行緒池具備以下幾個組成部分:1.執行緒池管理器 2.工作執行緒 3.任務介面 4.任務佇列

執行緒池管理器用於建立並管理執行緒池,工作執行緒是執行緒池中實際執行的執行緒,將執行緒執行的任務抽象成任務介面,從而使執行緒池與具體任務無關,執行緒池具體實現是可能是佇列,鍊錶等資料結構

具體步驟如下:

1.建立1個 queue.queue() 的例項,使用資料(任務及其引數)進行填充

2.將經過填充的例項傳給執行緒類,後者繼承於 threading.thread

3.生成守護執行緒池

4.每次從佇列中取出並刪除乙個專案,得到任務及其引數,執行

5.乙個專案完成以後,使用queue.task_done()向任務已經完成的佇列傳送乙個訊號

6.對佇列執行join操作,等到隊列為空,退出主程式

(q:python中的queue物件提供了對執行緒同步的支援,是執行緒安全的,使用queue物件可以實現多個生產者和多個消費者組成的fifo佇列,生產者依次存入,消費者依次取出

*args:當函式的引數不確定是可以使用 *args 和 **kwargs,*args沒有key值,用於元組,**kwargs有key值,用於字典

def test_var_args(farg,*args):

for arg in args:

print  " another arg",arg

def test_var_kwargs(farg,*kwargs):

for key in kwargs:

print "another keyword arg: %s: %s" % (key,kwargs[key])

test_var_args(1,'two',3')

test_var_kwargs(farg=1,myarg2="two",myarg3=3)

python queue模組 定義了下列類和異常:

類1 class queue.queue(maxsize=0)

類2 class queue.lifoqueue(maxsize=0)

類3 class queue.priorityqueue(maxsize=0)

異常 exception queue.empty 在空的物件上呼叫get()會丟擲此異常

異常 evception queue.full 在滿的物件上呼叫put()會丟擲此異常

queue.task_done() 由佇列的消費者執行緒呼叫,告訴佇列該任務已經處理完畢

queue.join() 阻塞呼叫執行緒,資料被加入佇列,未完成的任務數就會增加,當消費者執行緒呼叫task_done(),意味著有消費者取得任務並完成,未完成的任務數就會減少,當未完成的任務數降為0,join()解除阻塞

thread中,join()方法的作用是呼叫執行緒,等待執行緒完成後才能向下進行。

建立執行緒的方式:1定義乙個類整合thread類 2覆蓋thread類中的run方法 3直接建立thread的子類物件執行緒 4呼叫start方法開啟執行緒並呼叫執行緒的任務run方法執行

start()   -->   start0()   -->   run()

乙個簡單的執行緒池**

thread_pool.py

執行緒池與程序池

從python3.2開始,標準庫為我們提供了concurrent.futures模組,它提供了threadpoolexecutor和processpoolexecutor兩個類,實現了對threading和multiprocessing的更高階的抽象,是使用非同步實現,充分利用cpu提高程式執行效率...

執行緒池與程序池

為什麼要裝到容器中 可以避免頻繁的建立和銷毀 程序 執行緒 來的資源開銷 可以限制同時存在的執行緒數量 以保證伺服器不會應為資源不足而導致崩潰 幫我們管理了執行緒的生命週期 管理了任務的分配 from concurrent.futures import threadpoolexecutor,proc...

執行緒池與程序池

from concurrent.futures import processpoolexecutor p processpoolexecutor 5 deftask n print n if name main for i in range 10 p.submit task,i submit 提交任...