標籤:current tar result adp cep 方法 進程池 fun 非同步
在一個池子裡,放固定數量的線程,這些線程等待任務,一旦有任務來,就有線程自發的去執行任務。
concurrent.futures 這個模組是非同步呼叫的機制
concurrent.futures 提交任務都是用submit
for + submit 多個任務的提交
shutdown 是等效於Pool中的close + join ,是不允許再繼續向池中增加任務,然後讓父進程(線程)等待池中所有進程執行完所有任務。
如何把多個任務扔進池中?
要麼使用 for+ submit 的方式去提交多個任務
要麼直接使用map(func,iterable)方式去提交多個任務
from concurrent.futures import ThreadPoolExecutorimport timedef func(num): sum = 0 for i in range(num): sum += i **2 print(sum)t = ThreadPoolExecutor(20)start = time.time()t.map(func, range(1000))t.shutdown()print(time.time() - start)
不同的方式提交多個任務(for + submit 或者map), 擁有不同的拿結果的方式
如果是for + submit 的方式提交任務,拿結果用result方法
如果是用map的方式提交任務,結果是一個產生器,採用__next__()的方式去拿結果
from concurrent.futures import ThreadPoolExecutordef func(num): sum = 0 for i in range(num): sum += i **2 return sumt = ThreadPoolExecutor(20)res = t.map(func, range(100))t.shutdown()while 1: try: print(res.__next__()) except: StopIteration
關於回呼函數,不管是Pool進程池的方式,還是ProcessPoolExecutor的方式開啟進程池,
回呼函數都是由父進程調用
關於回呼函數,ThreadPoolExecutor
回呼函數是由父進程調用
網路編程——線程池