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_nowaitget 之间的延迟 to/from 之间的队列协程。也许还有一种方法可以提示 asyncio 框架更早地处理队列中的项目?

注意:我正在使用的应用程序没有执行任何需要计算的工作。

事实证明问题是由我的应用程序使用 prompt_toolkit 进行一些 UI 更新引起的。我通过在 _run_once 内放置一些测量值来追踪这一点。无论如何,队列没有被处理,因为事件循环正忙于执行一些我没想到会花这么多时间的代码UI。