執行緒池(Thread Pool)是管理和重用一組執行緒的機制,它能有效地限制執行緒的數量,減少執行緒建立和銷燬的開銷,提高程式的效率。Python 的 concurrent.futures
模組提供了一個高層次的介面來使用執行緒池。下面是如何使用執行緒池的一些基本介紹和示例。
-
匯入必要的模組
首先你需要匯入
ThreadPoolExecutor
類,這個類在concurrent.futures
模組中:from concurrent.futures import ThreadPoolExecutor
-
建立執行緒池
你可以透過例項化
ThreadPoolExecutor
來建立一個執行緒池,執行緒池的大小可以透過指定max_workers
引數來設定:executor = ThreadPoolExecutor(max_workers=5)
-
提交任務
可以透過
submit
方法將任務提交給執行緒池,submit
方法接受一個可呼叫物件(如函式)和它的引數:def task(n): print(f'Processing {n}') return n * 2 future = executor.submit(task, 5)
-
獲取結果
submit
方法返回一個Future
物件,透過這個物件你可以獲取任務的執行結果:result = future.result() print(result) # 輸出 10
-
使用上下文管理器
為了確保執行緒池在使用完畢後能正確關閉,你可以使用上下文管理器:
with ThreadPoolExecutor(max_workers=5) as executor: futures = [executor.submit(task, i) for i in range(10)] results = [future.result() for future in futures] print(results)
-
使用
map
方法ThreadPoolExecutor
還提供了一個map
方法,它能將一個可迭代物件中的每個元素傳遞給一個函式,並返回結果的迭代器:def square(n): return n * n with ThreadPoolExecutor(max_workers=5) as executor: results = list(executor.map(square, range(10))) print(results) # 輸出 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
完整示例
以下是一個完整的示例,演示如何使用執行緒池來併發地執行多個任務:
from concurrent.futures import ThreadPoolExecutor
def task(n):
print(f'Processing {n}')
return n * 2
# 建立執行緒池
with ThreadPoolExecutor(max_workers=5) as executor:
# 提交多個任務
futures = [executor.submit(task, i) for i in range(10)]
# 獲取任務結果
results = [future.result() for future in futures]
print(results) # 輸出 [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
這個示例建立了一個包含 5 個工作執行緒的執行緒池,然後提交了 10 個任務,最後收集並列印這些任務的結果。