【问题标题】:When to use multiple event loops?何时使用多个事件循环?
【发布时间】:2017-11-21 06:22:11
【问题描述】:

我有一个基于 Python 3.5+ 异步框架(apistar、sanic 等)的网络应用程序。该应用程序进行各种 IO 调用 - 对数据库、Redis 等 - 也是异步的。

Some docs 建议使用额外的事件循环:

import asyncio
import peewee
from peewee_async import Manager, PostgresqlDatabase

loop = asyncio.new_event_loop() # Note: custom loop!
database = PostgresqlDatabase('test')
objects = Manager(database, loop=loop)

据我了解,await 语句允许事件循环在遇到 IO 时进行上下文切换,因此似乎完全不需要额外的事件循环。

使用额外的事件循环有什么好处,什么时候应该使用额外的循环?

【问题讨论】:

    标签: python python-3.x async-await python-asyncio event-loop


    【解决方案1】:

    您应该在运行测试时一个接一个地使用多个事件循环,因此每个测试用例都针对自己的事件循环运行。

    您可能必须同时使用多个循环,具体取决于底层框架的要求。例如pyzmqquamash 需要它们自己的事件循环。

    如果您需要更好地控制任务执行,您可能希望同时使用多个循环。例如,当您想要明确地对任务进行分组并决定应该执行哪个组时。

    请记住,当前的实现只允许每个线程一次运行一个循环。

    【讨论】:

      【解决方案2】:

      您应该一次只使用一个 IO 循环,并且每个线程一次只允许一个 IO 循环。 threadingasyncio 使用不同且对比鲜明的并发方法。运行多个循环(在多个线程中)被认为是一种不好的做法,应该避免。

      上面的文档不建议使用“附加”循环。它展示了如何在不(或之前)将其注册为默认循环的情况下明确指定自定义循环。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-26
        • 1970-01-01
        • 2017-11-28
        相关资源
        最近更新 更多