asyncio:put_nowait 和 to/from 队列之间有 50 毫秒的延迟
asyncio: 50ms delay between put_nowait and get to/from a queue
我有一个 python asyncio 应用程序,在一个线程中有多个协程 运行。一些数据正在使用队列传递。
队列消费者如下所示:
async def queue_consumer(q):
"""Consume from an asyncio.Queue, making it an async iterable"""
while True:
try:
e = await q.get()
yield e
except:
continue
正在使用 async for
拉出消费者。
在这种特殊情况下,从特定队列中消费的协程顺序调用一些代码,这些代码使用 put_nowait
. 将数据放入其队列中
编辑:在这种特殊情况下,正在侦听入站网络流量的协程 A 将消息放入协程 B 的队列中。
我注意到在协程 A 中调用 put_nowait
与拉取数据之间存在一致的 ~50 毫秒延迟来自协程 B 中可迭代的队列异步
我怀疑它可能与某些 asyncio 内部轮询解决方案有关,但我不确定,我不会怀疑在哪里可以修改此类配置。
我对增加异步 loop
中的事件轮询频率非常感兴趣,因此,减少观察到的 put_nowait
和 get
之间的延迟 to/from 之间的队列协程。也许还有一种方法可以提示 asyncio 框架更早地处理队列中的项目?
注意:我正在使用的应用程序没有执行任何需要计算的工作。
事实证明问题是由我的应用程序使用 prompt_toolkit
进行一些 UI 更新引起的。我通过在 _run_once
内放置一些测量值来追踪这一点。无论如何,队列没有被处理,因为事件循环正忙于执行一些我没想到会花这么多时间的代码UI。
我有一个 python asyncio 应用程序,在一个线程中有多个协程 运行。一些数据正在使用队列传递。
队列消费者如下所示:
async def queue_consumer(q):
"""Consume from an asyncio.Queue, making it an async iterable"""
while True:
try:
e = await q.get()
yield e
except:
continue
正在使用 async for
拉出消费者。
在这种特殊情况下,从特定队列中消费的协程顺序调用一些代码,这些代码使用 将数据放入其队列中
编辑:在这种特殊情况下,正在侦听入站网络流量的协程 A 将消息放入协程 B 的队列中。put_nowait
.
我注意到在协程 A 中调用 put_nowait
与拉取数据之间存在一致的 ~50 毫秒延迟来自协程 B 中可迭代的队列异步
我怀疑它可能与某些 asyncio 内部轮询解决方案有关,但我不确定,我不会怀疑在哪里可以修改此类配置。
我对增加异步 loop
中的事件轮询频率非常感兴趣,因此,减少观察到的 put_nowait
和 get
之间的延迟 to/from 之间的队列协程。也许还有一种方法可以提示 asyncio 框架更早地处理队列中的项目?
注意:我正在使用的应用程序没有执行任何需要计算的工作。
事实证明问题是由我的应用程序使用 prompt_toolkit
进行一些 UI 更新引起的。我通过在 _run_once
内放置一些测量值来追踪这一点。无论如何,队列没有被处理,因为事件循环正忙于执行一些我没想到会花这么多时间的代码UI。