我想測量可以并行呼叫的服務 (API) 的運行時間。concurrent.futures基準測驗和使用(多處理/多執行緒)的正確方法是什么?
我們可以submit()執行任務,然后一旦任務完成,我們就可以檢查它concurrent.futures.as_completed()- 我們是否需要as_completed()部件,因為它應該為我們回傳結果,submit()剛剛開始任務?
根據我的虛擬代碼,它看起來不需要,但為什么as_completed()不需要呢?(我認為submit()將任務放入佇列中,并且不等待回應,并且as_completed()您將獲得已完成的任務和結果)。
讓我們呼叫服務my_job():
import concurrent.futures
import time
from typing import List
def _my_job(t: int):
time.sleep(t)
def measure(N_requ: int, workers: int, wait_time: int, include_as_completed: bool):
futures = []
start_time = time.time()
with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor:
for _ in range(N_requ):
f = executor.submit(_my_job, wait_time)
futures.append(f)
if include_as_completed:
for f in concurrent.futures.as_completed(futures):
try:
_ = f.result()
except:
print("This should not happen...")
pass
end_time = time.time()
elapsed_time: float = end_time - start_time
print(f"Elpsed time: {elapsed_time} | n_workers: {workers}, n_requs: {N_requ}, job's wait_time: {wait_time}")
if __name__ == "__main__":
N = 20
n_workers: List[int] = [1, 4, 16, 32]
print("Without as_completed:")
for w in n_workers:
measure(N, workers=w, wait_time=1, include_as_completed=False)
print("With as_completed:")
for w in n_workers:
measure(N, workers=w, wait_time=1, include_as_completed=True)
結果:
Without as_completed:
Elpsed time: 20.05830979347229 | n_workers: 1, n_requs: 20, job's wait_time: 1
Elpsed time: 5.012893199920654 | n_workers: 4, n_requs: 20, job's wait_time: 1
Elpsed time: 2.0075199604034424 | n_workers: 16, n_requs: 20, job's wait_time: 1
Elpsed time: 1.0035851001739502 | n_workers: 32, n_requs: 20, job's wait_time: 1
With as_completed:
Elpsed time: 20.044990062713623 | n_workers: 1, n_requs: 20, job's wait_time: 1
Elpsed time: 5.009936809539795 | n_workers: 4, n_requs: 20, job's wait_time: 1
Elpsed time: 2.0069048404693604 | n_workers: 16, n_requs: 20, job's wait_time: 1
Elpsed time: 1.0069079399108887 | n_workers: 32, n_requs: 20, job's wait_time: 1
uj5u.com熱心網友回復:
您將執行程式用作背景關系管理器。在with區塊結束時,您會自動關閉執行程式,等待所有未決的期貨完成。
請參閱檔案Executor.shutdown,尤其是有關with行為的部分。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/430560.html
