何时使用多个事件循环?

时间:2017-11-21 06:22:11

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

我有一个基于Python 3.5+异步框架(apistar,sanic等)构建的Web应用程序。该应用程序进行各种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时进行上下文切换,因此额外的事件循环似乎完全没必要。

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

2 个答案:

答案 0 :(得分:1)

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

上述文档并未建议使用“额外”循环。它显示了如何在没有(或之前)将其注册为默认循环的情况下明确指定自定义循环。

答案 1 :(得分:1)

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

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

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

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