目次
concurrent.futures.ThreadPoolExecutorを使用します
キューを使用してthreading使用して、さらにコントロールしてください
さらに優れたI/Oパフォーマンスを得るために、 asyncio aiohttpを検討してください
マルチスレッドI/Oタスクの重要なヒント
ホームページ バックエンド開発 Python チュートリアル PythonでI/Oバウンドタスクにマルチスレッドを使用する方法は?

PythonでI/Oバウンドタスクにマルチスレッドを使用する方法は?

Aug 19, 2025 am 10:41 AM
マルチスレッド化 I/O密集型

I/O集約型タスクの場合、Pythonでのマルチスレッドはパフォーマンスを大幅に改善できます。 concurrent.futures.threadpoolexecutorを使用することは推奨される方法であり、スレッドプールを管理することにより、同時操作を簡素化します。 1. ThreadPoolexecutorを使用して、通常5〜20に設定されたMAX_Workersのスレッドの数を制御します。 2。executor.map()を使用してI/Oタスクを同時に実行し、結果を順番に取得するか、submit()およびas_completed()を使用して結果を処理します。 3.より詳細な制御が必要な場合は、queue.queueを使用して永続的なワーカースレッドを実装できます。 4。同時のI/Oの場合、オーバーヘッドを減らすために代わりにAsyncioとAIOHTTPを使用することをお勧めします。 5.あまりにも多くのスレッドを避け、例外処理に注意し、スレッドセーフログと共有データメカニズムを使用します。 ThreadPoolexecutorはほとんどのシナリオに適しており、基礎となる方法または非同期ソリューションは、より高いパフォーマンスまたはより粒状制御が必要な場合にのみ使用されます。

PythonでI/Oバウンドタスクにマルチスレッドを使用する方法は?

PythonのI/Oバウンドタスクの場合、HTTP要求の作成、ファイルの読み取り、データベースのクエリなど、マルチスレッドを使用すると、プログラムが一度に1つではなく複数のI/O操作を同時に待つことができるようにすることで、パフォーマンスを大幅に改善できます。

Cpythonのグローバルインタープリターロック(GIL)のため、マルチスレッドはCPUが多いタスクをスピードアップしませんが、スレッドは外部リソースを待っている間に制御をもたらす可能性があるため、I/Oバウンド作業に非常に適しています。

I/Oバウンドタスクにマルチスレッドを効果的に使用する方法は次のとおりです。


concurrent.futures.ThreadPoolExecutorを使用します

最も簡単で最も近代的な方法は、 concurrent.futuresモジュールからThreadPoolExecutorを使用することです。スレッドのプールを管理し、低レベルのスレッド管理に対処せずにタスクを送信できます。

 CONCURRENT.FUTURESをインポートします
リクエストをインポートします

def fetch_url(url):
    response = requests.get(url)
    return len(respons.content)

urls = [
    "https://httpbin.org/delay/1"、
    "https://httpbin.org/delay/2"、
    "https://httpbin.org/delay/1"、
]

#ThreadPoolexecutorを使用して、I/Oタスクを並行して実行します
concurrent.futures.threadpoolexecutor(max_workers = 5)を執行者として:
    results = list(executor.map(fetch_url、urls))

印刷(結果)
  • max_workers 、作成されるスレッドの数を制御します。一般的な選択は、システムとタスクの種類に応じて、I/Oタスクで5〜20です。
  • executor.map() 、各URLで関数を同時に実行し、結果を順番に返します。
  • 代替: executor.submit() as_completed()が終了時に結果を処理する場合。

キューを使用してthreading使用して、さらにコントロールしてください

より微調整されたコントロール(例えば、長期にわたるワーカースレッド)が必要な場合は、 queue.Queueを備えたthreadingモジュールを使用できます。

スレッドをインポートします
キューをインポートします
リクエストをインポートします
インポート時間

DEFワーカー(Q):
    本当です:
        url = q.get()
        URLがなしである場合:
            壊す
        試す:
            response = requests.get(url)
            print(f "fetched {url}:{respons.status_code}")
        eとしての例外を除く:
            print(f "エラーFetching {url}:{e}")
        ついに:
            q.task_done()

#キューとスレッドを設定します
q = queue.queue()
num_threads = 5

#ワーカースレッドを開始します
スレッド= []
_ in range(num_threads):
    t = threading.thread(target = worker、args =(q、))
    t.start()
    threads.append(t)

#キューにURLを追加します
urls = ["https://httpbin.org/get"] * 10
URLのURLの場合:
    Q.put(url)

#すべてのタスクが完了するのを待ちます
Q.Join()

#労働者を停止します
_ in range(num_threads):
    Q.put(なし)
スレッドのtの場合:
    T.Join()

このパターンは、I/Oタスクの連続ストリームがある場合、または持続的な労働者が必要な場合に役立ちます。


さらに優れたI/Oパフォーマンスを得るために、 asyncio aiohttpを検討してください

スレッドはうまく機能しますが、大量のI/O(たとえば、数百のHTTPリクエスト)の場合、 asyncioを使用した非同期アプローチは、スレッドオーバーヘッドを避けるため、しばしばより効率的です。

aiohttpの例:

 Asyncioをインポートします
aiohttpをインポートします

async def fetch(session、url):
    Async with Session.get(url)として応答:
        await response.text()を返す

async def main():
    urls = ["https://httpbin.org/get"] * 10
    async with aiohttp.clientsession()as session:
        tasks = [fetch(session、url)for url in urls]
        応答= asyncio.gather(*タスク)を待っています
    応答を返します

#実行します
結果= asyncio.run(main())
  • スレッドもギルの競合もありません。
  • 操作ごとにはるかに低いメモリとCPUオーバーヘッド。
  • Async/await syntaxによる急勾配の学習曲線。

マルチスレッドI/Oタスクの重要なヒント

  • あまりにも多くのスレッドを使用しないでください:10〜50で十分です。数千人がオーバーヘッドのためにパフォーマンスを損なう可能性があります。
  • スレッドの例外を処理する:スレッドの猛攻撃の例外は静かに失敗する可能性があります。
  • スレッドセーフロギングを使用します。複数のスレッドからロギングする場合は、ロギングを安全に使用します( loggingモジュールはデフォルトでスレッドセーフです)。
  • 共有された可変状態を避けてください:スレッドがデータを共有する必要がある場合は、 queue.Queueまたはlocks( threading.Lock )を使用します。
  • 単純なケースについては、 ThreadPoolExecutorを好みます。クリーンで堅牢です。

基本的に、I/Oバウンドタスクの場合、 ThreadPoolExecutorほとんどのPython開発者にとって頼りになります。それはシンプルで効果的で、あなたのための複雑さを処理します。より細かい制御またはより高いスループットが必要な場合にのみ、低レベルに移動するか、 asyncioに切り替えます。

以上がPythonでI/Oバウンドタスクにマルチスレッドを使用する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Stock Market GPT

Stock Market GPT

AIを活用した投資調査により賢明な意思決定を実現

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ホットトピック

C++ 関数の例外とマルチスレッド: 同時環境でのエラー処理 C++ 関数の例外とマルチスレッド: 同時環境でのエラー処理 May 04, 2024 pm 04:42 PM

C++ での関数例外処理は、マルチスレッド環境でスレッドの安全性とデータの整合性を確保するために特に重要です。 try-catch ステートメントを使用すると、特定の種類の例外が発生したときにそれをキャッチして処理し、プログラムのクラッシュやデータの破損を防ぐことができます。

PHPでマルチスレッドを実装するにはどうすればよいですか? PHPでマルチスレッドを実装するにはどうすればよいですか? May 06, 2024 pm 09:54 PM

PHP マルチスレッドとは、1 つのプロセスで複数のタスクを同時に実行することを指します。これは、独立して実行されるスレッドを作成することによって実現されます。 PHP の Pthreads 拡張機能を使用して、マルチスレッド動作をシミュレートできます。インストール後、Thread クラスを使用してスレッドを作成および開始できます。たとえば、大量のデータを処理する場合、データを複数のブロックに分割し、対応する数のスレッドを作成して同時処理することで効率を向上させることができます。

マルチスレッド環境における C++ メモリ管理の課題と対策? マルチスレッド環境における C++ メモリ管理の課題と対策? Jun 05, 2024 pm 01:08 PM

マルチスレッド環境では、C++ メモリ管理はデータ競合、デッドロック、メモリ リークなどの課題に直面します。対策には次のものが含まれます: 1. ミューテックスやアトミック変数などの同期メカニズムの使用、 2. ロックフリーのデータ構造の使用、 4. (オプション) ガベージ コレクションの実装。

マルチスレッド環境では PHP 関数はどのように動作しますか? マルチスレッド環境では PHP 関数はどのように動作しますか? Apr 16, 2024 am 10:48 AM

マルチスレッド環境では、PHP 関数の動作はそのタイプによって異なります。 通常の関数: スレッドセーフで、同時に実行できます。グローバル変数を変更する関数: 安全ではないため、同期メカニズムを使用する必要があります。ファイル操作機能: 安全ではないため、アクセスを調整するには同期メカニズムを使用する必要があります。データベース操作機能: 安全ではないため、競合を防ぐためにデータベース システムのメカニズムを使用する必要があります。

Java 関数の同時実行性とマルチスレッド化によってパフォーマンスはどのように向上するのでしょうか? Java 関数の同時実行性とマルチスレッド化によってパフォーマンスはどのように向上するのでしょうか? Apr 26, 2024 pm 04:15 PM

Java 関数を使用した同時実行およびマルチスレッド技術により、次の手順を含むアプリケーションのパフォーマンスを向上させることができます。 同時実行およびマルチスレッドの概念を理解する。 Java の同時実行性と、ExecutorService や Callable などのマルチスレッド ライブラリを活用します。マルチスレッドの行列乗算などのケースを練習して、実行時間を大幅に短縮します。同時実行性とマルチスレッドによってもたらされる、アプリケーションの応答速度の向上と最適化された処理効率の利点をお楽しみください。

マルチスレッド環境での JUnit 単体テスト フレームワークの使用 マルチスレッド環境での JUnit 単体テスト フレームワークの使用 Apr 18, 2024 pm 03:12 PM

マルチスレッド環境で JUnit を使用する場合、シングルスレッド テストとマルチスレッド テストという 2 つの一般的なアプローチがあります。シングルスレッド テストは同時実行性の問題を回避するためにメイン スレッドで実行されますが、マルチスレッド テストはワーカー スレッドで実行され、共有リソースが妨げられないように同期されたテスト アプローチが必要です。一般的な使用例には、マルチスレッド環境での JUnit のアプリケーションを反映する、キーと値のペアを格納するための ConcurrentHashMap の使用や、キーと値のペアを操作してその正しさを検証するための同時スレッドなど、マルチスレッド セーフなメソッドのテストが含まれます。 。

C++ のマルチスレッドで共有リソースを処理するにはどうすればよいですか? C++ のマルチスレッドで共有リソースを処理するにはどうすればよいですか? Jun 03, 2024 am 10:28 AM

ミューテックスは C++ でマルチスレッド共有リソースを処理するために使用されます。std::mutex を通じてミューテックスを作成します。 mtx.lock() を使用してミューテックスを取得し、共有リソースへの排他的アクセスを提供します。ミューテックスを解放するには mtx.unlock() を使用します。

C++ マルチスレッド プログラミングにおけるデバッグとトラブルシューティングのテクニック C++ マルチスレッド プログラミングにおけるデバッグとトラブルシューティングのテクニック Jun 03, 2024 pm 01:35 PM

C++ マルチスレッド プログラミングのデバッグ手法には、データ競合アナライザーを使用して読み取りと書き込みの競合を検出し、同期メカニズム (ミューテックス ロックなど) を使用して競合を解決することが含まれます。スレッド デバッグ ツールを使用してデッドロックを検出し、ネストされたロックを回避し、デッドロック検出メカニズムを使用してデッドロックを解決します。データ競合アナライザーを使用してデータ競合を検出し、書き込み操作をクリティカル セクションに移動するか、アトミック操作を使用して解決します。パフォーマンス分析ツールを使用してコンテキストの切り替え頻度を測定し、スレッド数の削減、スレッド プールの使用、タスクのオフロードによって過剰なオーバーヘッドを解決します。

See all articles