Asyncio を使用した Python のディスパッチャー

イベントベースのプログラミングは、順番に実行される一連の命令ではなく、発生するイベントによってプログラムの流れが決定されるプログラミング パラダイムです。イベントベースのプログラミングでは、プログラムは、あらかじめ決められた一連の命令を実行するのではなく、システムまたは環境内のイベントに応答します。
ユーザー入力、システム イベント、ネットワーク アクティビティ、タイマーなど、さまざまなソースがイベントをトリガーできます。イベントが発生すると、プログラムは、その特定のイベントを処理するために登録された 1 つ以上の関数またはコールバックを実行することによって、それに反応することができます。これにより、特定の一連のアクションが完了するのを待つのではなく、発生したイベントに反応できるため、プログラムの柔軟性と応答性が向上します。
イベントベースのプログラミングは、グラフィカル ユーザー インターフェイス (GUI) で一般的に使用されます。GUI では、マウス クリックやキーボード入力などのユーザー アクションが、プログラム内のアクションまたは更新をトリガーするイベントとして扱われます。また、HTTP 要求またはブラウザー イベントがサーバー側またはクライアント側のコード実行をトリガーする Web 開発でも使用されます。イベント ドリブン アーキテクチャは、メッセージやイベントが異なるサービスやコンポーネント間で通信する分散システムでも一般的になりつつあります。
発車係
イベントベースのプログラミングのコンテキストでは、ディスパッチャーはイベントを受け取り、適切なイベント ハンドラーにディスパッチするオブジェクトです。ディスパッチャーは、イベント ハンドラーの登録と登録解除を管理し、イベントが正しいハンドラーに確実に配信されるようにする役割を果たします。
一部のイベント駆動型フレームワークでは、ディスパッチャーはイベント バスまたはループと呼ばれます。イベント バスは、さまざまなソースからイベントを受け取り、適切なイベント ハンドラにディスパッチします。イベント ループは、イベントに応答して、コルーチンとコールバックのスケジューリングと実行を管理します。
ディスパッチャーは、イベントがイベント ハンドラーにディスパッチされる前に、イベントのフィルター処理や処理など、他のタスクを実行することもできます。たとえば、ディスパッチャーはパブリッシュ/サブスクライブ パターンを実装する場合があります。このパターンでは、イベントはフィルター処理され、サブスクライブしてイベントを受信するイベント ハンドラーのみにディスパッチされます。
Asyncio を使用して Python で Dispatcher を作成する
Python で asyncio を使用してディスパッチャを作成するには、asyncio.Queue
クラスを使用して、コルーチン間でメッセージを渡すために使用できるキューを作成できます。簡単なディスパッチャの実装例を次に示します。ファイルを作成しdispatcher.py
、次のコードを挿入します。
import asyncio
async def producer(queue):
for i in range(10):
await asyncio.sleep(1)
await queue.put(i)
await queue.put(None)
async def consumer(queue):
while True:
item = await queue.get()
if item is None:
break
print(f"Consumed: {item}")
queue.task_done()
async def main():
queue = asyncio.Queue()
tasks = [
asyncio.create_task(producer(queue)),
asyncio.create_task(consumer(queue)),
]
await asyncio.gather(*tasks)
await queue.join()
asyncio.run(main())
コルーチンではmain
、 のインスタンスを作成しasyncio.Queue
、 と コルーチンの両方に渡しproducer
ますconsumer
。次に、 を使用して両方のコルーチンのタスクを作成しasyncio.create_task()
、それらを に渡してasyncio.gather()
同時に実行します。最後に、queue.join()
すべてのタスクが完了するまで待機するように呼び出します。
でファイルを実行しますpython3 dispatcher.py
。以下の出力が得られます。

この記事のコードは、Github で入手できます。
結論
通常、ディスパッチャは、イベントベースのシステムでイベントを管理する上で重要な役割を果たします。イベントが効率的かつ正確に処理され、必要に応じてイベント ハンドラーが正しく登録および登録解除されることが保証されます。
この記事は以上です。コメントにフィードバックや質問を残してください。これがエキサイティングな読み物だと思ったら、拍手を残してフォローしてください!乾杯!