1. 程式人生 > >網絡編程——線程池

網絡編程——線程池

bmi iteration pan 繼續 sum exe ESS ces code

在一個池子裏,放固定數量的線程,這些線程等待任務,一旦有任務來,就有線程自發的去執行任務。

concurrent.futures 這個模塊是異步調用的機制

concurrent.futures 提交任務都是用submit

for + submit 多個任務的提交

shutdown 是等效於Pool中的close + join ,是不允許再繼續向池中增加任務,然後讓父進程(線程)等待池中所有進程執行完所有任務。

如何把多個任務扔進池中?

  要麽使用 for+ submit 的方式去提交多個任務

  要麽直接使用map(func,iterable)方式去提交多個任務

  

from
concurrent.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()

while
1: try: print(res.__next__()) except: StopIteration

關於回調函數,不管是Pool進程池的方式,還是ProcessPoolExecutor的方式開啟進程池,

回調函數都是由父進程調用

關於回調函數,ThreadPoolExecutor

回調函數是由父進程調用

網絡編程——線程池