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