網絡編程——線程池
阿新 • • 發佈:2018-08-27
bmi iteration pan 繼續 sum exe ESS ces code
在一個池子裏,放固定數量的線程,這些線程等待任務,一旦有任務來,就有線程自發的去執行任務。
concurrent.futures 這個模塊是異步調用的機制
concurrent.futures 提交任務都是用submit
for + submit 多個任務的提交
shutdown 是等效於Pool中的close + join ,是不允許再繼續向池中增加任務,然後讓父進程(線程)等待池中所有進程執行完所有任務。
如何把多個任務扔進池中?
要麽使用 for+ submit 的方式去提交多個任務
要麽直接使用map(func,iterable)方式去提交多個任務
fromconcurrent.futures import ThreadPoolExecutor import time def 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 ThreadPoolExecutor def func(num): sum = 0 for i in range(num): sum += i **2 return sum t = ThreadPoolExecutor(20) res = t.map(func, range(100)) t.shutdown() while1: try: print(res.__next__()) except: StopIteration
關於回調函數,不管是Pool進程池的方式,還是ProcessPoolExecutor的方式開啟進程池,
回調函數都是由父進程調用
關於回調函數,ThreadPoolExecutor
回調函數是由父進程調用
網絡編程——線程池