Event Loop

Python SELF JA
レベル 25 , レッスン 5
使用可能

6.1 イベントループの取得

Event Loopは、Pythonのasyncioモジュールを使った非同期プログラミングの中心的なコンポーネントだよ。非同期タスクの実行、イベントの処理、I/O操作の実行を管理してくれるんだ。イベントループがあることで、複数のタスクが同時に実行されてもメインの実行スレッドをブロックしないんだ。

イベントループの生成と取得

  • asyncio.get_event_loop(): 現在のイベントループを返すか、なければ新しいものを作成するよ。
  • asyncio.new_event_loop(): 新しいイベントループを作成するんだ。
  • asyncio.set_event_loop(loop): 指定されたイベントループを現在のものとして設定するよ。

例:

asyncioには現在のイベントループがあって、それにはすべての実行中のタスクが含まれているんだ。現在のイベントループを取得するか、新しいものを作成してそれを現在のものとして設定することができるんだ。下の例で示しているよ。


import asyncio

loop = asyncio.get_event_loop()
print(loop)  # 現在のイベントループ
new_loop = asyncio.new_event_loop()
asyncio.set_event_loop(new_loop)
print(asyncio.get_event_loop())  # 新しい設定済みイベントループ

get_event_loop()メソッドは現在アクティブなイベントループを返すんだよ。新しいイベントループの作成とその設定には注意が必要で、非同期アプリケーションでの競合を避けるために慎重に使用する必要があるよ。

イベントループの開始

  • run_forever(): イベントループを開始し、stop()が呼ばれるまで続けるんだ。
  • run_until_complete(future): イベントループを開始し、指定されたコルーチンまたはfutureオブジェクトが完了したら終了するよ。

例:

イベントループは2つのモードで開始できるんだ。無限に動くモード — 例えばwhile Trueみたいな感じ、または特定のタスクが完了するまで。


import asyncio

async def hello():
    print("Hello")
    await asyncio.sleep(1)
    print("World")
            
loop = asyncio.get_event_loop()
loop.run_until_complete(hello())
loop.close()

Event Looprun_forever()モードで開始した場合、それは内部で無限ループを回し続けるんだ。run_forever()メソッドは、何かしらの非同期タスクがEventLoopstop()メソッドを呼ばない限り、終了しないよ。

イベントループの停止

  • stop(): イベントループを停止するんだ。
  • is_running(): イベントループが実行中ならTrueを返すよ。

例:

無限モードでループが開始されていると、タスクを受け取って実行し続けるから、自動的に停止しないんだ。誰かが現在のループオブジェクトを取得して、そのstop()メソッドを呼び出す必要があるよ。無限ループが回っているかどうかを知りたいときは、is_running()メソッドを呼び出すんだ。


import asyncio
            
loop = asyncio.get_event_loop()
loop.stop()
print(loop.is_running())  # False

6.2 イベントループの重要なメソッド

メソッド call_soon(callback, *args)

callback 関数を*argsの引数で可能な限り早く呼び出すように計画するんだ。


import asyncio

def my_callback():
    print("Callback executed")
            
loop = asyncio.get_event_loop()
loop.call_soon(my_callback)
loop.run_forever()

関数 callbackをタスクリストの一番最初に置いて、できるだけ早く実行を開始するようにするんだ。非同期でない関数もメソッドに渡せるよ。このメソッドは、非同期アプリケーションで迅速な応答が必要なとき、特に遅延を最小限にしてタスクを実行する必要があるときに便利だよ。

メソッド call_later(delay, callback, *args)

delay秒後にcallback関数を*argsの引数で呼び出すように計画するんだ。


import asyncio

def my_callback():
    print("Callback executed after delay")
            
loop = asyncio.get_event_loop()
loop.call_later(2, my_callback)
loop.run_forever()

このメソッドは関数の遅延呼び出しを可能にしてるよ: 最初のパラメータに秒単位の遅延(小数も可)を渡して、その後に関数とそのパラメータのリファレンスを渡すんだ。非同期でない関数もメソッドに渡せるんだ。このメソッドは、緊急度の異なるタスクの管理に使用できて、複雑な非同期システムの設計に役立つよ。

メソッド call_at(when, callback, *args)

whenの時刻にcallback関数を*argsの引数で呼び出すように計画するんだ。


import asyncio
import time
            
def my_callback():
    print("Callback executed at specific time")
            
loop = asyncio.get_event_loop()
when = loop.time() + 2  # 現在のイベントループの時間から2秒後
loop.call_at(when, my_callback)
loop.run_forever()

タスクを5秒後ではなく、例えば15:00や24:00に実行したい場合は、関数 call_at()を利用すると便利だよ。この関数は関数 call_soon()と同じように動作するけど、最初のパラメータにはポーズの長さではなく呼び出す時間を渡すんだ。非同期でない関数もメソッドに渡せるんだ。

利点と特徴

非同期実行: イベントループは、メインの実行スレッドをブロックせずに、多くのタスクを並行して実行できるんだ。

効率的なリソース管理: 非同期のI/O操作はブロックせずに実行され、プログラムはより効率的になるよ。

柔軟性とスケーラビリティ: イベントループは多くのメソッドをサポートしていて、タスクの計画やイベントの処理ができるから、複雑でスケーラブルな非同期アプリケーションを作成できるよ。

6.3 タスクとFutureオブジェクトとの連携

イベントループは、タスク(Task)やFutureオブジェクトの実行を管理していて、それらの状態を追跡し、準備ができ次第、実行を保証してくれるんだ。

例:


import asyncio

async def main():
    await asyncio.sleep(1)
    print("Task completed")
            
loop = asyncio.get_event_loop()
task = loop.create_task(main())
loop.run_until_complete(task)

この例では、create_taskメソッドを使って作成されたタスクの実行をイベントループがどう管理するかを示しているんだ。call_soon(), call_later(), call_at()メソッドを使って、緊急度の異なるタスクの実行を管理できるよ。これが複雑な非同期システムの設計に役立つんだ。

1
Опрос
マルチスレッド,  25 уровень,  5 лекция
недоступен
マルチスレッド
マルチスレッド
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION