ホームページ >バックエンド開発 >Python チュートリアル >Python 更新の非同期サポートでの相互運用性

Python 更新の非同期サポートでの相互運用性

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-20 00:21:09387ブラウズ

前回の IoP アップデートからしばらく時間が経ちました。 追いつきましょう!

Interoperability On Python update async support

IoP コマンドライン インターフェイスに大幅な機能強化が追加されました。

  • 名前の変更: プロジェクトの新しいブランドに合わせて、grongier.pex モジュールの名前が iop に変更されました。
  • 非同期サポート: IoP は非同期関数とコルーチンを完全にサポートするようになりました。

プロジェクト名の変更

grongier.pex モジュールは下位互換性のためにアクセス可能なままですが、将来のリリースでは削除される予定です。 新規開発には iop モジュールを使用します。

非同期機能

IoP は長い間非同期呼び出しをサポートしてきましたが、以前は非同期関数とコルーチンを直接使用することはできませんでした。 この新しい機能を検討する前に、InterSystems IRIS 内で非同期呼び出しがどのように機能するかを確認し、2 つの例を調べてみましょう。

従来の非同期呼び出し

これは従来のアプローチを示しています:

<code class="language-python">from iop import BusinessProcess
from msg import MyMessage


class MyBP(BusinessProcess):

    def on_message(self, request):
        msg_one = MyMessage(message="Message1")
        msg_two = MyMessage(message="Message2")

        self.send_request_async("Python.MyBO", msg_one, completion_key="1")
        self.send_request_async("Python.MyBO", msg_two, completion_key="2")

    def on_response(self, request, response, call_request, call_response, completion_key):
        if completion_key == "1":
            self.response_one = call_response
        elif completion_key == "2":
            self.response_two = call_response

    def on_complete(self, request, response):
        self.log_info(f"Received response one: {self.response_one.message}")
        self.log_info(f"Received response two: {self.response_two.message}")</code>

これは、IRIS の非同期呼び出しの動作を反映しています。 send_request_async はビジネス オペレーションにリクエストを送信し、on_response は受け取ったレスポンスを処理します。 completion_key は応答を区別します。

同期マルチリクエスト機能

まったく新しいわけではありませんが、複数の同期リクエストを同時に送信できる機能は注目に値します。

<code class="language-python">from iop import BusinessProcess
from msg import MyMessage


class MyMultiBP(BusinessProcess):

    def on_message(self, request):
        msg_one = MyMessage(message="Message1")
        msg_two = MyMessage(message="Message2")

        tuple_responses = self.send_multi_request_sync([("Python.MyMultiBO", msg_one),
                                                        ("Python.MyMultiBO", msg_two)])

        self.log_info("All requests have been processed")
        for target, request, response, status in tuple_responses:
            self.log_info(f"Received response: {response.message}")</code>

この例では、2 つのリクエストを同じビジネス オペレーションに同時に送信します。応答は、各呼び出しのターゲット、要求、応答、ステータスを含むタプルです。これは、リクエストの順序が重要ではない場合に特に便利です。

非同期関数とコルーチン

IoP で非同期関数とコルーチンを活用する方法は次のとおりです。

<code class="language-python">import asyncio

from iop import BusinessProcess
from msg import MyMessage


class MyAsyncNGBP(BusinessProcess):

    def on_message(self, request):

        results = asyncio.run(self.await_response(request))

        for result in results:
            print(f"Received response: {result.message}")

    async def await_response(self, request):
        msg_one = MyMessage(message="Message1")
        msg_two = MyMessage(message="Message2")

        tasks = [self.send_request_async_ng("Python.MyAsyncNGBO", msg_one),
                 self.send_request_async_ng("Python.MyAsyncNGBO", msg_two)]

        return await asyncio.gather(*tasks)</code>

これは、send_request_async_ng を使用して複数のリクエストを同時に送信します。 asyncio.gather は、すべての応答が同時に待機されることを保証します。

ここまで読んでくださった方は「ブーメラン」にコメントをお願いします! それは大きな意味を持つでしょう。ありがとうございます!

await_response は、複数のリクエストを送信し、すべての応答を待つコルーチンです。

非同期関数とコルーチンを使用する利点には、並列リクエストによるパフォーマンスの向上、可読性と保守性の向上、asyncio モジュールを使用した柔軟性の向上、例外とタイムアウトの処理の向上が含まれます。

非同期メソッドの比較

send_request_asyncsend_multi_request_syncsend_request_async_ng の主な違いは何ですか?

  • send_request_async: on_response が実装されており、completion_key が使用されている場合にのみ、リクエストを送信し、応答を待ちます。 シンプルですが、並列リクエストのスケーラビリティは低くなります。
  • send_multi_request_sync: 複数のリクエストを同時に送信し、すべての応答を待ちます。使い方は簡単ですが、応答順序は保証されません。
  • send_request_async_ng: 複数のリクエストを同時に送信し、応答の順序を維持しながらすべての応答を待ちます。非同期関数とコルーチンが必要です。

マルチスレッドを楽しんでください!

以上がPython 更新の非同期サポートでの相互運用性の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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