策略
****

警告:

  策略已弃用，并将在 Python 3.16 中删除。鼓励用户使用 "asyncio.run()"
  函数或 "asyncio.Runner" 并附带 *loop_factory* 以使用想要的循环实现。

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

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

自定义事件循环策略可以控制 "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" 事件循环实现的替代事件循环策略。

   适用范围: Windows.

   自 3.14 版本弃用: "WindowsSelectorEventLoopPolicy" 类已被弃用并将在
   Python 3.16 中移除。

class asyncio.WindowsProactorEventLoopPolicy

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

   适用范围: Windows.

   自 3.14 版本弃用: "WindowsProactorEventLoopPolicy" 类已被弃用并将在
   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())
