# 策略

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

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

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

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

## 获取和设置策略

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

asyncio.get_event_loop_policy()

  返回当前进程域的策略。

asyncio.set_event_loop_policy(policy)

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

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

## 策略对象

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

class asyncio.AbstractEventLoopPolicy

  异步策略的抽象基类。

  get_event_loop()

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

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

    该方法永远不应返回 `None`。

    在 3.6 版本发生变更.

  set_event_loop(loop)

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

  new_event_loop()

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

    该方法永远不应返回 `None`。

asyncio附带下列内置策略:

class asyncio.DefaultEventLoopPolicy

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

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

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

  自 3.12 版本弃用: 现在默认 asyncio 策略的 `get_event_loop()` 方法将在没有正在运行的事件循环而决定创建一个事件循环时发出 `DeprecationWarning`。 在未来的某个 Python 发布版中这将改为发出错误。

class asyncio.WindowsSelectorEventLoopPolicy

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

  可用性: Windows。

class asyncio.WindowsProactorEventLoopPolicy

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

  可用性: Windows。

## 自定义策略

要实现一个新的事件循环策略，建议子类化 `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())