何时使用多个事件循环?

Posted

技术标签:

【中文标题】何时使用多个事件循环?【英文标题】: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 时进行上下文切换,因此似乎完全不需要额外的事件循环。

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于何时使用多个事件循环?的主要内容,如果未能解决你的问题,请参考以下文章

JS | Event Loop 事件循环

js常用对象:点击双击onload事件鼠标相关onblur事件和onfocus事件等;通过循环给多个元素添加事件通过addEventListener() 方法 监听事件函数

异步编程之事件循环机制

浏览器事件循环机制

通过循环将 TouchUpInside 事件分配给多个 UIImageView,并使用可以进一步动画/操作每个 UIImageView 的处理程序方法

RunLoop