ホームページ >バックエンド開発 >Python チュートリアル >Python 更新の非同期サポートでの相互運用性
前回の IoP アップデートからしばらく時間が経ちました。 追いつきましょう!
IoP コマンドライン インターフェイスに大幅な機能強化が追加されました。
grongier.pex
モジュールの名前が 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_async
、send_multi_request_sync
、send_request_async_ng
の主な違いは何ですか?
send_request_async
: on_response
が実装されており、completion_key
が使用されている場合にのみ、リクエストを送信し、応答を待ちます。 シンプルですが、並列リクエストのスケーラビリティは低くなります。send_multi_request_sync
: 複数のリクエストを同時に送信し、すべての応答を待ちます。使い方は簡単ですが、応答順序は保証されません。send_request_async_ng
: 複数のリクエストを同時に送信し、応答の順序を維持しながらすべての応答を待ちます。非同期関数とコルーチンが必要です。マルチスレッドを楽しんでください!
以上がPython 更新の非同期サポートでの相互運用性の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。