1. 程式人生 > >concurrent.futures用法

concurrent.futures用法

submit   非同步提交
map(func, *iterables, timeout=None, chunksize=1)   類似  map(func,   *iterables)除了以下:        迭代器是立即收集的而不是延遲收集的        func是非同步執行的和對func的多個呼叫可以併發執行
shutdown(wait=True)   相當於程序池的pool.close()+pool.join()操作 wait=True,等待池內所有任務執行完畢回收完資源後才繼續 wait=False,立即返回,並不會等待池內的任務執行完畢 但不管wait引數為何值,整個程式都會等到所有任務執行完畢 submit和map必須在shutdown之前
result(timeout=None)   取得結果,如果在for中引用將會形成阻塞
add_done_callback(fn)   回撥函式,非同步執行
submit 使用和驗證非同步執行: import time import os import threading from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor     def func():     time.sleep(2)     print('11',threading.current_thread().getName())   if __name__ == '__main__':     tpool = ThreadPoolExecutor(max_workers=2) #max_workers指定多少個執行緒     # tpool = ProcessPoolExecutor(max_workers=5) #程序池的使用只需要將上面的ThreadPoolExecutor改為ProcessPoolExecutor就行了,其他都不用改     start = time.time()     for i in range(2):         tpool.submit(func)     tpool.shutdown() #加了shutdown等close()加join(),鎖pool並等子執行緒結束才主執行緒才結束     end = time.time() - start     print(end) 結果:
11 ThreadPoolExecutor-0_0 11 ThreadPoolExecutor-0_1 2.001002073287964 func()設定了休眠兩秒,這時設定程序池,並用submit()功能執行,發現執行兩次func()的時間是兩秒,所以得出submit是非同步執行結果   map的使用 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import threading import os,time,random def task(n):     print('%s is runing' %threading.get_ident())     time.sleep(random.randint(1,3))     return n**2   if __name__ == '__main__':       executor=ThreadPoolExecutor(max_workers=3)       # for i in range(11):     #     future=executor.submit(task,i)       s = executor.map(task,range(1,5)) #map取代了for+submit,將1,2,3,4的值傳入task進行非同步執行     print([i for i in s])   結果: 123145491988480 is runing 123145497243648 is runing 123145502498816 is runing 123145497243648 is runing [1, 4, 9, 16]   回撥函式(add_done_callback): import time import os import threading from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor   def func(n):     time.sleep(2)     return n*n   def call_back(m):     print('結果為:%s'%(m.result()))   tpool = ThreadPoolExecutor(max_workers=5) t_lst = [] for i in range(5):     t = tpool.submit(func,i).add_done_callback(call_back) #將tpool.submit(func,i)的返回值給函式call_back非同步執行 結果: 結果為:0 結果為:9 結果為:4 結果為:1 結果為:16   for中result引發阻塞 import time from concurrent.futures import ThreadPoolExecutor   def func(n):     time.sleep(2)     return n*n     tpool = ThreadPoolExecutor(max_workers=5) t_lst = [] start = time.time() for i in range(5):     t = tpool.submit(func,i)     print(t.result()) end = time.time() - start print("時間:%f"%end) 結果: 0 1 4 9 16 時間:10.023604