Page cover

Future


Future Class 封裝了可調用非同步執行的物件。 Future 實例由 submit() 建立,任務的回傳值是 Future 的實例,而不是在任務的結果。

result()

用於阻塞(block)和等待 Future 物件的完成,並檢索其結果。

PYTHON
result(timeout=None)

timeout:等待結果的最大秒數。如果timeout=None,將無限期阻塞,直到結果可用。如果超過timeout,則會引發 TimeoutError。

範例:

PYTHON
import time
from concurrent.futures import ThreadPoolExecutor

def long_running_task():
    print("Starting the long-running task...")
    time.sleep(2)
    print("Long-running task completed!")
    return "Result"

# Create worker threads
with ThreadPoolExecutor() as executor:
	# Submit tasks
    future = executor.submit(long_running_task)
    
	# Results
    result = future.result()
    print("Result:", result)

done()


用於檢查 Future 物件是否已經完成執行。它返回一個 bool,指示任務是否已經完成。 如果任務已經完成,返回 True; 否則返回 False

範例:

add_done_callback()


允許您註冊一個回調函數,將會在任務完成時執行。 當您需要執行其他操作或在任務完成後處理任務結果時,此方法特別有用。

範例:

running()


檢查任務是否正在執行且無法取消。

執行結果:

cancel()


嘗試取消任務。如果調用當前正在執行的任務或已完成的任務,則該方法將返回 False。

cancelled()


檢查任務是否已被取消。

exception()


返回調用任務所引發的 exception。

as_completed()


返回一個 iterator,我們可以在任務完成後,立即處理任務結果。而不是等待所有任務完成,一次性返回。 這在處理大量任務或任務完成順序很重要時,特別有用。

fs: iterable Future 物件

timeout: 等待結果的最大秒數。如果timeout=None,將無限期阻塞,直到結果可用。

as_completed()map() 之間的主要區別在於 tasks 結果的順序。

as_completed():按 Submit tasks 完成的順序。 map():按 Submit tasks 順序。

範例:

執行結果:

wait()


等待 fs 給出的 Future 實例完成。

參數
說明

fs

需要等待的 Future 實例的序列。 可以是一個或多個的 iterable 物件(例如:List, Set)。 這些 Futures 可以由不同的 Executor 實例創建。

timeout

等待結果的最大秒數。如果 timeout=None,將無限期阻塞,直到 Future 完成。

return_when

指定返回的條件。 "FIRST_COMPLETED":當任何的 Future 完成或被取消時,立即將 wait() 返回。 "ALL_COMPLETED":當所有的 Future 完成或被取消時,立即將 wait() 返回。 "FIRST_COMPLETED":當任何 Future 完成並引發 Exception 時,立即將 wait() 返回。如果沒有引發 Exception,則等同於 "ALL_COMPLETED"

範例 – FIRST_COMPLETED


執行結果:

範例 – FIRST_EXCEPTION


執行結果:

參考資料


concurrent.futures — 啟動並行任務 — Python 3.11.4 文檔

multiprocessing — Process-based parallelism — Python 3.11.4 documentation

stoensin map – github gist

確定並發和並行的優勢 - 使用 Java 並發擴展您的代碼 - OpenClassrooms

ThreadPoolExecutor 與全局解釋器鎖 (GIL)

concurrent.futures 平行任務處理 - Python 教學 | STEAM 教育學習網

concurrent.futures — 創立非同步任務 — 你所不知道的 Python 標準函式庫用法 06 | louie_lu's blog

Python的GIL是什麼鬼,多線程性能研究究竟如何 • cenalulu's Tech Blog

並發與並行:有什麼區別? | 登錄半徑博客

08、多執行緒 和 多進程 :以斐波拉契亞數列計算為例,只需要切換一下類即可完成從多執行緒到多進程的轉化_鞍-的博客-CSDN博客

Python 好用模組教學 - concurrent.futures - MyApollo

並發執行 — Python 3.11.4 文檔

Last updated

Was this helpful?