何时使用多个事件循环?
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】:您应该在运行测试时一个接一个地使用多个事件循环,因此每个测试用例都针对自己的事件循环运行。
您可能必须同时使用多个循环,具体取决于底层框架的要求。例如pyzmq
和quamash
需要它们自己的事件循环。
如果您需要更好地控制任务执行,您可能希望同时使用多个循环。例如,当您想要明确地对任务进行分组并决定应该执行哪个组时。
请记住,当前的实现只允许每个线程一次运行一个循环。
【讨论】:
【参考方案2】:您应该一次只使用一个 IO 循环,并且每个线程一次只允许一个 IO 循环。 threading
和 asyncio
使用不同且对比鲜明的并发方法。运行多个循环(在多个线程中)被认为是一种不好的做法,应该避免。
上面的文档不建议使用“附加”循环。它展示了如何在不(或之前)将其注册为默认循环的情况下明确指定自定义循环。
【讨论】:
以上是关于何时使用多个事件循环?的主要内容,如果未能解决你的问题,请参考以下文章
js常用对象:点击双击onload事件鼠标相关onblur事件和onfocus事件等;通过循环给多个元素添加事件通过addEventListener() 方法 监听事件函数
通过循环将 TouchUpInside 事件分配给多个 UIImageView,并使用可以进一步动画/操作每个 UIImageView 的处理程序方法