Python 執行緒池使用

Undefined443發表於2024-06-14

執行緒池(Thread Pool)是管理和重用一組執行緒的機制,它能有效地限制執行緒的數量,減少執行緒建立和銷燬的開銷,提高程式的效率。Python 的 concurrent.futures 模組提供了一個高層次的介面來使用執行緒池。下面是如何使用執行緒池的一些基本介紹和示例。

  1. 匯入必要的模組

    首先你需要匯入ThreadPoolExecutor類,這個類在concurrent.futures模組中:

    from concurrent.futures import ThreadPoolExecutor
    
  2. 建立執行緒池

    你可以透過例項化ThreadPoolExecutor來建立一個執行緒池,執行緒池的大小可以透過指定max_workers引數來設定:

    executor = ThreadPoolExecutor(max_workers=5)
    
  3. 提交任務

    可以透過submit方法將任務提交給執行緒池,submit方法接受一個可呼叫物件(如函式)和它的引數:

    def task(n):
        print(f'Processing {n}')
        return n * 2
    
    future = executor.submit(task, 5)
    
  4. 獲取結果

    submit方法返回一個Future物件,透過這個物件你可以獲取任務的執行結果:

    result = future.result()
    print(result)  # 輸出 10
    
  5. 使用上下文管理器

    為了確保執行緒池在使用完畢後能正確關閉,你可以使用上下文管理器:

    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)
    
  6. 使用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 個任務,最後收集並列印這些任務的結果。

相關文章