ポリシー

警告

ポリシーは非推奨で、Python 3.16 で削除されます。 使いたいイベントループの実装を選ぶには、asyncio.run() 関数、または asyncio.Runner に loop_factory を指定する方法を推奨します。

イベントループポリシーは、現在の イベントループ の取得・設定と、新しいイベントループの作成に使うグローバルオブジェクトです。 異なるイベントループの実装を使うには、デフォルトのポリシーを 組み込みの別のポリシー に 置き換える ことができます。 また、これらの動作を変更する カスタムポリシー に置き換えることもできます。

ポリシーオブジェクト は、コンテキスト ごとに独立したイベントループを取得・設定します。 デフォルトではスレッドごとですが、カスタムポリシーでは コンテキスト を別の単位で定義できます。

カスタムイベントループポリシーは、get_event_loop()、set_event_loop()、new_event_loop() の動作を制御できます。

ポリシーオブジェクトは AbstractEventLoopPolicy 抽象基底クラスで定義された API を実装しなければなりません。

ポリシーの取得と設定

以下の関数は現在のプロセスに対するポリシーの取得や設定をするために使われます:

asyncio.get_event_loop_policy()

プロセス全体にわたる現在のポリシーを返します。

バージョン 3.14 で非推奨: get_event_loop_policy() 関数は非推奨で、Python 3.16 で削除されます。

asyncio.set_event_loop_policy(policy)

プロセス全体にわたる現在のポリシーを policy に設定します。

policy が None の場合、デフォルトポリシーが現在のポリシーに戻されます。

バージョン 3.14 で非推奨: set_event_loop_policy() 関数は非推奨で、Python 3.16 で削除されます。

ポリシーオブジェクト

イベントループポリシーの抽象基底クラスは以下のように定義されています:

class asyncio.AbstractEventLoopPolicy

asyncio ポリシーの抽象基底クラスです。

get_event_loop()

現在のコンテキストのイベントループを取得します。

AbstractEventLoop のインターフェースを実装したイベントループオブジェクトを返します。

このメソッドは None を返してはいけません。

バージョン 3.6 で変更.

set_event_loop(loop)

現在のコンテキストにイベントループ loop を設定します。

new_event_loop()

新しいイベントループオブジェクトを生成して返します。

このメソッドは None を返してはいけません。

バージョン 3.14 で非推奨: AbstractEventLoopPolicy クラスは非推奨で、Python 3.16 で削除されます。

asyncio は以下の組み込みポリシーを提供します:

class asyncio.DefaultEventLoopPolicy

デフォルトの asyncio ポリシーです。Unix では SelectorEventLoop 、Windows では ProactorEventLoop を使います。

デフォルトのポリシーを手動でインストールする必要はありません。 asyncio はデフォルトポリシーを使うように自動的に構成されます。

バージョン 3.8 で変更: Windows では ProactorEventLoop がデフォルトで使われるようになりました。

バージョン 3.14 で変更: asyncio のデフォルトポリシーの get_event_loop() は、イベントループが設定されていなければ RuntimeError を送出するようになりました。

バージョン 3.14 で非推奨: DefaultEventLoopPolicy クラスは非推奨で、Python 3.16 で削除されます。

class asyncio.WindowsSelectorEventLoopPolicy

SelectorEventLoop イベントループ実装を使った別のイベントループポリシーです。

バージョン 3.14 で非推奨: WindowsSelectorEventLoopPolicy クラスは非推奨で、Python 3.16 で削除されます。

class asyncio.WindowsProactorEventLoopPolicy

ProactorEventLoop イベントループ実装を使った別のイベントループポリシーです。

バージョン 3.14 で非推奨: WindowsProactorEventLoopPolicy クラスは非推奨で、Python 3.16 で削除されます。

ポリシーのカスタマイズ

新しいイベントループのポリシーを実装するためには、以下に示すように DefaultEventLoopPolicy を継承して振る舞いを変更したいメソッドをオーバーライドすることが推奨されます。:

class MyEventLoopPolicy(asyncio.DefaultEventLoopPolicy):

    def get_event_loop(self):
        """Get the event loop.

        This may be None or an instance of EventLoop.
        """
        loop = super().get_event_loop()
        # Do something with loop ...
        return loop

asyncio.set_event_loop_policy(MyEventLoopPolicy())