ホームページ >バックエンド開発 >Python チュートリアル >Python サーバー プログラミング スキル: 非同期 I/O プログラミングの実装

Python サーバー プログラミング スキル: 非同期 I/O プログラミングの実装

王林
王林オリジナル
2023-06-18 10:53:23830ブラウズ

Python は、インタープリタ型プログラミング言語として、ネットワーク プログラミングに関連するさまざまなライブラリを含む、非常に強力なライブラリ サポートを備えています。 Python によるサーバー プログラミングの分野では、非同期 I/O プログラミングは非常に重要なテクノロジです。この記事では、非同期 I/O プログラミングとは何か、非同期 I/O を使用する方が効率的である理由、および Python で非同期 I/O プログラミングを実装するためのテクニックを紹介します。

非同期 I/O プログラミングとは何ですか?

従来の同期 I/O プログラミングでは、プログラムは通常、ブロックして 1 つの操作が完了するのを待ってから、次の操作に進みます。ネットワークの通信速度が遅いため、このような待ち時間が発生するとプログラムの実行効率が著しく低下し、コンピュータのリソースを十分に活用できなくなります。

非同期 I/O プログラミングは、ブロックや待機を行わないプログラミング手法であり、I/O 操作が完了するまで待機している間も後続のコードの実行を続けることができます。これは、非同期イベント ループ メカニズムとノンブロッキング I/O 操作を使用して実現されます。

非同期 I/O プログラミングを通じて、複数の I/O 操作 (ファイルの読み取りと書き込み、ネットワーク要求など) を同時に実行し、すべての I/O 操作が完了するまで待機してから次の手順に進むことができます。次のステップ。これにより、効率的な同時処理が可能になります。

なぜ非同期 I/O プログラミングを使用するのでしょうか?

同期 I/O プログラミングと比較すると、非同期 I/O プログラミングには非常に明らかな利点がいくつかあります。

  1. 効率の向上: 非同期 I/O プログラミングはコンピューター リソースを最大限に活用できます。プログラムの実行効率を向上させます。これは、I/O 操作が待機しているときに、ブロックされるのを待たずにすぐに別の操作に切り替えることができるため、待機時間の無駄を回避できるためです。
  2. スケーラビリティの向上: 非同期 I/O プログラミングでは、アプリケーションはスレッド リソースをブロックしたり使い果たしたりすることなく、複数の接続を同時に処理できます。これにより、非同期 I/O プログラミングで多数の同時接続をサポートしやすくなります。
  3. 応答性の向上: 非同期 I/O プログラミングにより、プログラムの柔軟性が向上し、ユーザーの要求にタイムリーに応答し、多数の同時接続を処理するときに I/O 操作をより速く完了できます。

非同期 I/O プログラミングを実装するためのヒント

Python で非同期 I/O プログラミングを実装するには、関連するライブラリを使用する必要があります。次のライブラリは、Python で一般的に使用される非同期 I/O ライブラリです:

  1. asyncio: Python 標準ライブラリの非同期 I/O ライブラリは、オペレーティング システム レベルの非同期 I/O サポートを提供し、非同期を処理できます。ネットワーク接続と IPC (プロセス間通信)。
  2. Tornado: 非常に強力な Web フレームワークであり、高性能の非同期ネットワーク ライブラリと非同期 I/O 関数を備えた非同期 I/O ライブラリです。
  3. gevent など: Python 標準ライブラリの非同期 I/O ライブラリに加えて、非常に優れた非同期 I/O サポートを提供するサードパーティ ライブラリもいくつかあります。

次に、asyncio ライブラリを例として、Python での非同期 I/O プログラミングの手法を紹介します。

  1. コルーチンの定義

asyncio ライブラリでは、コルーチンは非同期プログラミングの基本単位であり、スレッド内で使用できる軽量のスレッドです。複数のコルーチンを実行します。同時に。コルーチンは、実行を一時停止および再開できる関数として見ることができ、yield ステートメントを使用して実行を一時停止できます。 Python 3.5 以降では、async/await キーワードを使用すると、コルーチンの作成と管理が簡単になります。

以下は簡単なコルーチンの例です:

import asyncio

async def coroutine_demo():
    print("Start")
    await asyncio.sleep(1)
    print("End")

上記のコードは coroutine_demo という名前のコルーチンを定義しており、コルーチンが実行中であることを示すために await ステートメントがコルーチン内で使用されています。実行は一時停止されます。非同期 I/O 操作が完了するのを待っている間。ここでは、asyncio ライブラリの sleep 関数を使用して、I/O 操作中の待機時間をシミュレートします。

  1. イベント ループ

asyncio ライブラリのイベント ループは、非同期 I/O 操作の中核です。イベント ループは無限ループを使用して非同期イベントをリッスンし、イベントが発生すると、すぐに処理して返すことができます。イベント ループは、メッセージ システムとして理解できます。メッセージは非同期 I/O 操作の結果です。

次に、単純なイベント ループの例を示します。

import asyncio

async def coroutine_demo():
    print("Start")
    await asyncio.sleep(1)
    print("End")

loop = asyncio.get_event_loop()
loop.run_until_complete(coroutine_demo())
loop.close()

この例では、まず coroutine_demo という名前のコルーチンが定義されます。次に、イベント ループが作成され、run_until_complete() メソッドを使用して coroutine_demo コルーチンが実行されます。実行後、コルーチンは最初の行に「Start」を出力し、1 秒待ってから「End」を出力します。

イベント ループはメイン スレッドで実行する必要があることに注意してください。他のスレッドで run_loop() メソッドを呼び出すと、プログラムは例外をスローします。

  1. コールバック関数

非同期 I/O プログラミングでは、非同期イベントが発生すると、イベント ループは対応するコールバック関数 (コールバック関数) を実行するようにコルーチンに通知します。 。コールバック関数は、非同期 I/O 操作の結果を処理するために使用される通常の関数です。

次に、単純なコールバック関数の例を示します。

import asyncio

async def coroutine_demo():
    print("Start")
    await asyncio.sleep(1)
    print("End")

def callback_func(future):
    print("Callback function")

loop = asyncio.get_event_loop()
future = asyncio.ensure_future(coroutine_demo())
future.add_done_callback(callback_func)
loop.run_until_complete(future)
loop.close()

この例では、関数 callback_func は、コルーチンの実行終了時に呼び出されるコールバック関数です。

  1. 非同期 I/O 操作

非同期 I/O プログラミングでは、ほとんどすべての I/O 操作を async/await キーワードを使用してコルーチンにカプセル化する必要があります。たとえば、asyncio ライブラリの open 関数を使用して、ファイルを非同期に読み書きすることができます。

import asyncio

async def read_file(path):
    async with aiohttp.ClientSession() as session:
    async with session.get(path) as response:
        return await response.text()

loop = asyncio.get_event_loop()
result = loop.run_until_complete(read_file("http://example.com"))
loop.close()

この例では、aiohttp ライブラリの ClientSession オブジェクトを使用して非同期 HTTP リクエストを作成し、応答を取得するには、await キーワードを使用します。text() が非同期 I/O を待機させる鍵となります。

要約

如上所述,非同步I/O程式設計是一種高效的程式模式,可以大幅提高程式的執行效率和回應性。 Python語言擁有非常豐富的非同步I/O函式庫,包括Python標準函式庫的asyncio函式庫以及第三方函式庫Tornado和gevent等。學好異步I/O程式設計的技巧對於Python伺服器程式設計師而言,是非常必要的。

以上がPython サーバー プログラミング スキル: 非同期 I/O プログラミングの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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