ホームページ  >  記事  >  バックエンド開発  >  Python同時プログラミングでコルーチンを適用する方法

Python同時プログラミングでコルーチンを適用する方法

王林
王林転載
2023-05-13 08:16:051353ブラウズ

コルーチンとは何ですか?

コルーチンは、スレッドよりも軽量な同時実行メソッドであり、スレッド コンテキストの切り替えのオーバーヘッドを必要とせず、単一スレッドで同時実行を実現できます。コルーチンには通常、次のような特徴があります。

  • コルーチン内のコードは、必要に応じて実行を一時停止したり再開したりできます。

  • 同じスレッド内で複数のコルーチンを同時に実行できますが、一度に実行されるコルーチンは 1 つだけです。

  • コルーチンは通常、イベント ループ (イベント ループ) に基づいて実装され、イベント ループはコルーチンの実行のスケジュールを担当します。

コルーチンとスレッド

スレッドとコルーチンはどちらも同時プログラミングを実装する方法ですが、いくつかの異なる特性とアプリケーション シナリオがあります。

**スレッドはオペレーティング システムのスケジューリングの基本単位です。**各スレッドには、スレッド スタック、レジスタなどを含む独自の実行コンテキストがあります。スレッド間の切り替えには、現在のスレッドのコンテキストの保存や別のスレッドのコンテキストの復元などの操作を含むコンテキスト切り替えが必要であり、これらの操作は多くの時間とリソースを消費します。マルチスレッド プログラミングでは、スレッドの切り替えは次の理由から非常に一般的な操作です:

  1. スケジューリング。複数のスレッドが同時に実行される場合、オペレーティング システムはこれらのスレッドをスケジュールし、優先度などの要素に基づいて現在どのスレッドを実行するかを決定する必要があります。スレッドの切り替えは、スケジューリングの基本操作の 1 つであり、スレッドを切り替えることにより、オペレーティング システムは複数のスレッドを同時に実行できます。 ############待って。 IO 操作の完了を待つ、ロックが解放されるのを待つなど、スレッドがイベントの発生を待つ必要がある場合、スレッドは CPU を積極的に解放して、他のスレッドに実行の機会を与えることができます。待機が完了すると、スレッドが再び起動され、実行が続行されます。 ############同時。スレッドは同時実行の効果を実現できます。たとえば、1 つのスレッドがネットワーク リクエストを処理し、別のスレッドがユーザー インタラクションを処理します。これにより、システムの応答速度と処理能力が向上します。

  2. #実行のために他のスレッドに切り替えます。スレッドが無限ループに陥ったり例外が発生したりするなど、何らかの理由によりスレッドが実行を継続できなくなる場合があり、その際にはシステムクラッシュやスレッドのクラッシュを避けるために他のスレッドに切り替えて実行する必要があります。その他の問題。

  3. スレッドの同時プログラミングは、通常、マルチスレッドの競合、デッドロック、コンテキストの切り替えなどの問題によって制限されます。 Python でマルチスレッド プログラミングを使用する場合は、スレッド セーフや GIL などの問題に注意する必要があります。

    コルーチンは、ユーザー空間に実装され、オペレーティング システムのスケジューリングに依存しない軽量の同時実行メソッドです。コルーチンはコンテキストを切り替えることなく同じスレッドで同時実行を実現できるため、実行効率が非常に高くなります。コルーチンは通常、イベント ループ (イベント ループ) を使用してコルーチンの実行をスケジュールします。コルーチンが IO 操作や他のコルーチンを待機する必要がある場合、イベント ループは現在のコルーチンの実行を一時停止し、他のコルーチンを実行することで同時実行を実現します。効果。 Python では、コルーチンは通常、非同期 IO、ネットワーク プログラミング、タスク スケジューリング、およびその他のシナリオをサポートする
  4. asyncio
  5. モジュールを使用して実装されます。

    スレッドと比較したコルーチンの主な利点は次のとおりです:

軽量で占有リソースが少ない;

コンテキストなし切り替えが必要であり、実行効率が高くなります。

  • イベント ループをスケジューリングに使用して、高い同時実行性を実現できます。

  • GIL によって制限されており、マルチコア CPU をより効率的に利用できます。

  • ただし、コルーチンには、マルチコア CPU を利用できないこと、デバッグが難しいこと、その他の問題など、いくつかの制限もあります。スレッドまたはコルーチンの使用を選択する場合は、特定のアプリケーション シナリオに基づいて選択する必要があります。

    コルーチンのアプリケーション
  • コルーチンは、次のような多くのシナリオに適用できます。

ネットワーク プログラミング: コルーチンは、高い同時実行性のインターネット アプリケーションの実現に役立ちます。 。

非同期 IO: コルーチンは、非同期 IO 操作を効率的に処理するのに役立ちます。

  • データベース操作: コルーチンは、同時実行性の高いデータベース アプリケーションの実装に役立ちます。

  • タスク スケジューリング: コルーチンは、効率的なタスク スケジューリング システムの実装に役立ちます。

  • DemoDemo

    以下は、コルーチンと
  • asyncio
  • モジュールを使用して単純なタスク スケジューリングを実装する方法を示すサンプル コードです。 #
    import asyncio
    
    async def task1():
        print("Task 1")
        await asyncio.sleep(1)
        print("Task 1 done")
    
    async def task2():
        print("Task 2")
        await asyncio.sleep(2)
        print("Task 2 done")
    
    
    async def task3():
        print("Task 3")
        await asyncio.sleep(3)
        print("Task 3 done")
    
    
    async def main():
        await asyncio.gather(task1(), task2(), task3())

    このコードは、Python のコルーチンと

    asyncio
  • モジュールを使用し、3 つのコルーチン関数
task1

task2

task3、を定義します。そしてメインのコルーチン関数

main

。各コルーチン関数は独自のタスク名を出力し、一定時間停止します。メインのコルーチン関数は asyncio.gather を使用して 3 つのコルーチン関数を同時に実行し、最終的な出力結果は次のようになります: <pre class="brush:php;toolbar:false">Task 1 Task 2 Task 3 Task 1 done Task 2 done Task 3 done [Finished in 3.2s]</pre>

以上がPython同時プログラミングでコルーチンを適用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。