併發程式設計之執行緒池與程序池
阿新 • • 發佈:2020-07-28
Python標準模組--concurrent.futures
基本介紹
#1 介紹 concurrent.futures模組提供了高度封裝的非同步呼叫介面 ThreadPoolExecutor:執行緒池,提供非同步呼叫 ProcessPoolExecutor: 程序池,提供非同步呼叫 Both implement the same interface, which is defined by the abstract Executor class. #2 基本方法 #submit(fn, *args, **kwargs) 非同步提交任務 #map(func, *iterables, timeout=None, chunksize=1)取代for迴圈submit的操作 #shutdown(wait=True) 相當於程序池的pool.close()+pool.join()操作 wait=True,等待池內所有任務執行完畢回收完資源後才繼續 wait=False,立即返回,並不會等待池內的任務執行完畢 但不管wait引數為何值,整個程式都會等到所有任務執行完畢 submit和map必須在shutdown之前 #result(timeout=None) 取得結果 #add_done_callback(fn) 回撥函式# done()判斷某一個執行緒是否完成# cancle()取消某個任務
ThreadPoolExecutor的使用
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor import time import os # 括號內, 可以傳數字, 不傳的話預設會開設當前計算機cpu個數5倍的執行緒 pool = ThreadPoolExecutor(5) # 池子裡面固定只有五個執行緒 """ 執行緒池造出來之後, 裡面會固定存在五個執行緒, 這五個執行緒不會出現重複建立和銷燬的過程 """ """ 池子的使用非常簡單: 你只需要將需要做的任務往池子中提交即可, 自動會有人來服務你 """ def task(n):print(n) print(os.getpid()) time.sleep(2) return n * 2""" 任務的提交方式: 同步: 提交任務之後原地等待任務的返回結果, 期間不做任何事 非同步: 提交任務之後不等待任務的返回結果, 繼續往下執行 """ t_list = [] # pool.submit(task, 1) # 向池子中提交任務 非同步提交 for i in range(20): # 朝池子中提交20個任務 res = pool.submit(task, i) # print(res.result()) """ res.result() 程式由併發變成了序列, 任務為什麼列印的是None, res.result()拿到的是非同步提交的任務的返回結果 """ t_list.append(res) # 等待執行緒池中所有的任務執行完畢之後再進行往下執行 pool.shutdown() # 關閉執行緒池, 等待執行緒池中所有的任務執行完畢 for t in t_list: print('>>>:', t.result()) """ 非同步任務的返回結果應該通過回撥機制來操作 """
ProcessPoolExecutor的使用
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor import time import os # 括號內, 可以傳數字, 不傳的話預設會開設當前計算機cpu個數5倍的執行緒 # pool = ThreadPoolExecutor(5) # 池子裡面固定只有五個執行緒 pool = ProcessPoolExecutor(5) """ 執行緒池造出來之後, 裡面會固定存在五個執行緒, 這五個執行緒不會出現重複建立和銷燬的過程 """ """ 池子的使用非常簡單: 你只需要將需要做的任務往池子中提交即可, 自動會有人來服務你 """ def task(n): print(n) print(os.getpid()) time.sleep(2) return n * 2 def call_back(n): print('call_back',n.result) """ 任務的提交方式: 同步: 提交任務之後原地等待任務的返回結果, 期間不做任何事 非同步: 提交任務之後不等待任務的返回結果, 繼續往下執行 """ t_list = [] # pool.submit(task, 1) # 向池子中提交任務 非同步提交 for i in range(20): # 朝池子中提交20個任務 res = pool.submit(task, i).add_done_callback(call_back) # print(res.result()) """ res.result() 程式由併發變成了序列, 任務為什麼列印的是None, res.result()拿到的是非同步提交的任務的返回結果 """ t_list.append(res) # 等待執行緒池中所有的任務執行完畢之後再進行往下執行 pool.shutdown() # 關閉執行緒池, 等待執行緒池中所有的任務執行完畢 for t in t_list: print('>>>:', t.result()) """ 非同步任務的返回結果應該通過回撥機制來操作 """