ホームページ > バックエンド開発 > Python チュートリアル > # `ThreadPoolExecutor` で Python タスクを強化する

# `ThreadPoolExecutor` で Python タスクを強化する

Barbara Streisand
リリース: 2024-12-09 13:12:11
オリジナル
612 人が閲覧しました

# Boost Your Python Tasks with `ThreadPoolExecutor`

Python で複数のタスクを同時に実行する場合、concurrent.futures モジュールは強力で簡単なツールです。この記事では、ThreadPoolExecutor を使用してタスクを並列実行する方法と実際の例を説明します。

ThreadPoolExecutor を使用する理由

Python では、スレッドは、ネットワーク呼び出しやファイルの読み取り/書き込み操作など、I/O 操作が大部分を占めるタスクに最適です。 ThreadPoolExecutor を使用すると、次のことが可能になります。

  • スレッドを手動で管理することなく、複数のタスクを同時に実行します
  • アクティブなスレッドの数を制限します。システムに負荷がかかるのを防ぎます。
  • 直感的な API を使用して結果を簡単に収集します。

例: タスクの並列実行

概念を理解するために簡単な例を見てみましょう。

コード

from concurrent.futures import ThreadPoolExecutor
import time

# Function simulating a task
def task(n):
    print(f"Task {n} started")
    time.sleep(2)  # Simulates a long-running task
    print(f"Task {n} finished")
    return f"Result of task {n}"

# Using ThreadPoolExecutor
def execute_tasks():
    tasks = [1, 2, 3, 4, 5]  # List of tasks
    results = []

    # Create a thread pool with 3 simultaneous threads
    with ThreadPoolExecutor(max_workers=3) as executor:
        # Execute tasks in parallel
        results = executor.map(task, tasks)

    return list(results)

if __name__ == "__main__":
    results = execute_tasks()
    print("All results:", results)
ログイン後にコピー
期待される出力

このコードを実行すると、次のような内容が表示されます (やや並列的な順序で)。


Task 1 started
Task 2 started
Task 3 started
Task 1 finished
Task 4 started
Task 2 finished
Task 5 started
Task 3 finished
Task 4 finished
Task 5 finished
All results: ['Result of task 1', 'Result of task 2', 'Result of task 3', 'Result of task 4', 'Result of task 5']
ログイン後にコピー
max_workers=3 であるため、タスク 1、2、および 3 は同時に開始されます。他のタスク (4 と 5) は、スレッドが使用可能になるまで待機します。


いつ使用するか?

典型的な使用例:

  • API からのデータの取得: 複数の URL を同時に読み込みます。
  • ファイル処理: 複数のファイルを同時に読み取り、書き込み、または変換します。
  • タスク自動化: 複数のスクリプトまたはコマンドを並行して起動します。

ベストプラクティス

  1. スレッド数を制限する:

      スレッドが多すぎると、CPU に過負荷がかかったり、ボトルネックが発生したりする可能性があります。
  2. 例外を処理します:

      1 つのタスクが失敗すると、プール全体に影響を及ぼす可能性があります。関数で例外をキャッチします。
  3. CPU バウンドのタスクには ProcessPoolExecutor を使用する:

      Python の Global Interpreter Lock (GIL) のため、スレッドは負荷の高い計算には最適ではありません。

高度な例: URL を並行して取得する

これは実際の例です: 複数の URL を並行して取得します。


import requests
from concurrent.futures import ThreadPoolExecutor

# Function to fetch a URL
def fetch_url(url):
    try:
        response = requests.get(url)
        return f"URL: {url}, Status: {response.status_code}"
    except Exception as e:
        return f"URL: {url}, Error: {e}"

# List of URLs to fetch
urls = [
    "https://example.com",
    "https://httpbin.org/get",
    "https://jsonplaceholder.typicode.com/posts",
    "https://invalid-url.com"
]

def fetch_all_urls(urls):
    with ThreadPoolExecutor(max_workers=4) as executor:
        results = executor.map(fetch_url, urls)
    return list(results)

if __name__ == "__main__":
    results = fetch_all_urls(urls)
    for result in results:
        print(result)

ログイン後にコピー
結論

ThreadPoolExecutor は、Python でのスレッド管理を簡素化し、I/O バウンドのタスクを高速化するのに最適です。わずか数行のコードで操作を並列化し、貴重な時間を節約できます。

以上が# `ThreadPoolExecutor` で Python タスクを強化するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート