標籤: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初試多線程