通過threadpool初試多線程

來源:互聯網
上載者:User

標籤:async   安裝   取消   需要   star   thread   import   put   return   

import  threadpool,os    #threadpool需要pip安裝
def foo(i):
print("son process %d %s"%(i,os.getpid()))
return i
def back(req,a): #倆個參數,一個是運行函數foo的傳回值,還有輸入一個request對象否則會報錯
print(a)
if __name__=="__main__":
pool=threadpool.ThreadPool(5) #執行個體化空殼線程
lst=list(i for i in range(20))
reqs=threadpool.makeRequests(foo,lst,back) #傳入參數lst需要是一個集合列表,對比多進程,不需要迭代了
for req in reqs:
pool.putRequest(req) #將request對象傳入線程池
pool.wait() #相當於join()
print("end")
相比較於multiprocessing模組實現的多進程池,threadpool在執行個體化時候變化較大,三個介面:傳入方法,傳入參數,回呼函數都有變化(線程池此處不是執行個體化線程,而是執行個體化一個requests對象集合。而進程池則在這個傳參的時候就執行個體化線程了)。
可以看到,傳入方法和傳入函數,已經取消了關鍵字func和args,我們直接填入傳入對象名即可,其次,傳入參數變成了一個集合形式。而在進程池中,我們通過迭代給每一條線程傳入不同的參數(僅以簡單的i+=1作傳入)
回呼函數back需要倆個傳入參數一個是requests對象,另一個是線程方法傳回值,線程若是無傳回值,則為None。若這裡是進程池的話則只要接受傳回值即可。所以一定要注意傳入一個requests對象,否則會報錯。
整個執行個體線程的步驟:
通過thread.makeRequests()建立requests對象,因為傳入參數是個集合,所以建立的requests也是一個集合形式,通過一個迭代,將requests集合中的對象通過putRequest放入線程池運行,不用這一步類似於進程
池裡的apply_async()和多進程中的start()。

通過threadpool初試多線程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.