イベントドリブンプログラミング

イベントドリブンプログラミングは、イベントに焦点を当てています。最終的に、プログラムの流れはイベントに依存します。これまでは、順次実行モデルと並列実行モデルのどちらかを扱っていましたが、イベント駆動型プログラミングの概念を持つモデルは非同期モデルと呼ばれています。イベントドリブンプログラミングは、常に新しい着信イベントをリッスンしているイベントループに依存しています。イベントドリブンプログラミングの動作は、イベントに依存しています。イベントがループすると、イベントは何をどの順序で実行するかを決定します。次のフローチャートは、これがどのように機能するかを理解するのに役立ちます-

Pythonモジュール– Asyncio

AsyncioモジュールはPython3.4で追加され、コルーチンを使用してシングルスレッドの並行コードを記述するためのインフラストラクチャを提供します。以下は、Asyncioモジュールで使用されるさまざまな概念です。

イベントループ

イベントループは、計算コード内のすべてのイベントを処理する機能です。プログラム全体の実行中に途中で動作し、イベントの着信と実行を追跡します。Asyncioモジュールでは、プロセスごとに1つのイベントループを使用できます。以下は、イベントループを管理するためにAsyncioモジュールによって提供されるいくつかのメソッドです-

  • loop = get_event_loop() −このメソッドは、現在のコンテキストのイベントループを提供します。

  • loop.call_later(time_delay,callback,argument) −このメソッドは、指定されたtime_delay秒の後に呼び出されるコールバックを調整します。

  • loop.call_soon(callback,argument)−このメソッドは、できるだけ早く呼び出されるコールバックを手配します。call_soon()が戻った後、コントロールがイベントループに戻ったときに、コールバックが呼び出されます。

  • loop.time() −このメソッドは、イベントループの内部クロックに従って現在の時刻を返すために使用されます。

  • asyncio.set_event_loop() −このメソッドは、現在のコンテキストのイベントループをループに設定します。

  • asyncio.new_event_loop() −このメソッドは、新しいイベントループオブジェクトを作成して返します。

  • loop.run_forever() −このメソッドは、stop()メソッドが呼び出されるまで実行されます。

次のイベントループの例は、印刷に役立ちます hello worldget_event_loop()メソッドを使用する。この例は、Pythonの公式ドキュメントから抜粋したものです。

import asyncio

def hello_world(loop):
   print('Hello World')
   loop.stop()

loop = asyncio.get_event_loop()

loop.call_soon(hello_world, loop)

loop.run_forever()
loop.close()

出力

Hello World

先物

これは、実行されていない計算を表すconcurrent.futures.Futureクラスと互換性があります。asyncio.futures.Futureとconcurrent.futures.Futureの間に次の違いがあります-

  • result()メソッドとexception()メソッドは、timeout引数を取りません。また、futureがまだ実行されていない場合は、例外を発生させます。

  • add_done_callback()で登録されたコールバックは、常にイベントループのcall_soon()を介して呼び出されます。

  • asyncio.futures.Futureクラスは、concurrent.futuresパッケージのwait()およびas_completed()関数と互換性がありません。

以下は、asyncio.futures.futureクラスの使用方法を理解するのに役立つ例です。

import asyncio

async def Myoperation(future):
   await asyncio.sleep(2)
   future.set_result('Future Completed')

loop = asyncio.get_event_loop()
future = asyncio.Future()
asyncio.ensure_future(Myoperation(future))
try:
   loop.run_until_complete(future)
   print(future.result())
finally:
   loop.close()

出力

Future Completed

コルーチン

Asyncioのコルーチンの概念は、スレッドモジュールの下の標準のThreadオブジェクトの概念に似ています。これは、サブルーチンの概念の一般化です。コルーチンは実行中に一時停止して、外部処理を待機し、外部処理が実行されたときに停止したポイントから戻ることができます。次の2つの方法は、コルーチンの実装に役立ちます-

非同期定義関数()

これは、Asyncioモジュールでコルーチンを実装するためのメソッドです。以下は同じためのPythonスクリプトです-

import asyncio

async def Myoperation():
   print("First Coroutine")

loop = asyncio.get_event_loop()
try:
   loop.run_until_complete(Myoperation())

finally:
   loop.close()

出力

First Coroutine

@ asyncio.coroutineデコレータ

コルーチンを実装する別の方法は、@ asyncio.coroutineデコレータでジェネレータを利用することです。以下は同じためのPythonスクリプトです-

import asyncio

@asyncio.coroutine
def Myoperation():
   print("First Coroutine")

loop = asyncio.get_event_loop()
try:
   loop.run_until_complete(Myoperation())

finally:
   loop.close()

出力

First Coroutine

タスク

Asyncioモジュールのこのサブクラスは、イベントループ内のコルーチンの並列実行を担当します。次のPythonスクリプトは、いくつかのタスクを並行して処理する例です。

import asyncio
import time
async def Task_ex(n):
   time.sleep(1)
   print("Processing {}".format(n))
async def Generator_task():
   for i in range(10):
      asyncio.ensure_future(Task_ex(i))
   int("Tasks Completed")
   asyncio.sleep(2)

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

出力

Tasks Completed
Processing 0
Processing 1
Processing 2
Processing 3
Processing 4
Processing 5
Processing 6
Processing 7
Processing 8
Processing 9

トランスポート

Asyncioモジュールは、さまざまなタイプの通信を実装するためのトランスポートクラスを提供します。これらのクラスはスレッドセーフではなく、通信チャネルの確立後に常にプロトコルインスタンスとペアになります。

以下は、BaseTransportから継承された異なるタイプのトランスポートです。

  • ReadTransport −これは読み取り専用トランスポートのインターフェースです。

  • WriteTransport −これは書き込み専用トランスポートのインターフェースです。

  • DatagramTransport −これはデータを送信するためのインターフェースです。

  • BaseSubprocessTransport −BaseTransportクラスに似ています。

以下は、BaseTransportクラスの5つの異なるメソッドであり、その後、4つのトランスポートタイプ間で一時的になります。

  • close() −トランスポートを閉じます。

  • is_closing() −このメソッドは、トランスポートが閉じているか、すでに閉じている場合にtrueを返します。

  • get_extra_info(name, default = none) −これにより、輸送に関する追加情報が得られます。

  • get_protocol() −このメソッドは、現在のプロトコルを返します。

プロトコル

Asyncioモジュールは、ネットワークプロトコルを実装するためにサブクラス化できる基本クラスを提供します。これらのクラスは、トランスポートと組み合わせて使用​​されます。プロトコルは着信データを解析し、発信データの書き込みを要求しますが、トランスポートは実際のI / Oとバッファリングを担当します。以下はプロトコルの3つのクラスです-

  • Protocol −これは、TCPおよびSSLトランスポートで使用するストリーミングプロトコルを実装するための基本クラスです。

  • DatagramProtocol −これは、UDPトランスポートで使用するデータグラムプロトコルを実装するための基本クラスです。

  • SubprocessProtocol −これは、一方向パイプのセットを介して子プロセスと通信するプロトコルを実装するための基本クラスです。