策略

事件循环策略是一个用于获取和设置当前 事件循环 的全局对象,还可以创建新的事件循环。 默认策略可以可以被 替换内置替代策略 以使用不同的事件循环实现,或者替换为可以覆盖这些行为的 自定义策略

策略对象 可为每个 context 获取和设置单独的事件循环。 在默认情况下是分线程,不过自定义策略可以按不同的方式定义 context

自定义事件循环策略可以控制 get_event_loop(), set_event_loop()new_event_loop() 的行为。

策略对象应该实现 AbstractEventLoopPolicy 抽象基类中定义的API。

获取和设置策略

可以使用下面函数获取和设置当前进程的策略:

asyncio.get_event_loop_policy()

返回当前进程域的策略。

自 3.14.0a3 (unreleased) 版本弃用: The get_event_loop_policy() function is deprecated and will be removed in Python 3.16.

asyncio.set_event_loop_policy(policy)

policy 设置为当前进程域策略。

如果 policy 设为 None 将恢复默认策略。

自 3.14.0a3 (unreleased) 版本弃用: The set_event_loop_policy() function is deprecated and will be removed in Python 3.16.

策略对象

抽象事件循环策略基类定义如下:

class asyncio.AbstractEventLoopPolicy

异步策略的抽象基类。

get_event_loop()

为当前上下文获取事件循环。

返回一个实现 AbstractEventLoop 接口的事件循环对象。

该方法永远不应返回 None

在 3.6 版本发生变更.

set_event_loop(loop)

将当前上下文的事件循环设置为 loop

new_event_loop()

创建并返回一个新的事件循环对象。

该方法永远不应返回 None

自 3.14.0a3 (unreleased) 版本弃用: The AbstractEventLoopPolicy class is deprecated and will be removed in Python 3.16.

asyncio附带下列内置策略:

class asyncio.DefaultEventLoopPolicy

默认的 asyncio 策略。 在 Unix 上使用 SelectorEventLoop 而在 Windows 上使用 ProactorEventLoop

不需要手动安装默认策略。asyncio已配置成自动使用默认策略。

在 3.8 版本发生变更: 在 Windows 上,现在默认会使用 ProactorEventLoop

在 3.14 版本发生变更: The get_event_loop() method of the default asyncio policy now raises a RuntimeError if there is no set event loop.

自 3.14.0a3 (unreleased) 版本弃用: The DefaultEventLoopPolicy class is deprecated and will be removed in Python 3.16.

class asyncio.WindowsSelectorEventLoopPolicy

一个使用 SelectorEventLoop 事件循环实现的替代事件循环策略。

Availability: Windows.

自 3.14.0a3 (unreleased) 版本弃用: The WindowsSelectorEventLoopPolicy class is deprecated and will be removed in Python 3.16.

class asyncio.WindowsProactorEventLoopPolicy

使用 ProactorEventLoop 事件循环实现的另一种事件循环策略。

Availability: Windows.

自 3.14.0a3 (unreleased) 版本弃用: The WindowsProactorEventLoopPolicy class is deprecated and will be removed in Python 3.16.

自定义策略

要实现一个新的事件循环策略,建议子类化 DefaultEventLoopPolicy 并重写需要定制行为的方法,例如:

class MyEventLoopPolicy(asyncio.DefaultEventLoopPolicy):

    def get_event_loop(self):
        """获取事件循环。

        这可能为 None 或是一个 EventLoop 的实例。
        """
        loop = super().get_event_loop()
        # 对 loop 执行一些操作 ...
        return loop

asyncio.set_event_loop_policy(MyEventLoopPolicy())