asyncio: задержка 50 мс между put_nowait и получением очереди - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть приложение 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.

Я заметил, что существует постоянная ~ 50 мс задержка между вызовом put_nowait в сопрограмме A и затем данными, обрабатываемыми в результатевытаскивая его из очереди, асинхронно повторяемой в сопрограмме B.

Я подозреваю, что это может быть связано с каким-то внутренним разрешением асинхронного опроса, но я не уверен, не подозреваю, где такая конфигурация может быть изменена.

Я был бы очень заинтересован в увеличении частоты опроса событий в asyncio loop, следовательно, уменьшении наблюдаемой задержки между put_nowait и get в / из очереди между сопрограммами. Может быть, есть также способ подсказать платформе asyncio, чтобы раньше обрабатывать элементы из очереди?

Примечание: приложение, с которым я работаю, не выполняет никакой вычислительно сложной работы.

1 Ответ

0 голосов
/ 04 ноября 2019

Оказывается, проблема была вызвана тем, что мое приложение обновляло пользовательский интерфейс с prompt_toolkit. Я отследил это, поместив некоторые измерения в _run_once. В любом случае очередь не обрабатывалась, поскольку цикл обработки событий был занят выполнением некоторого кода пользовательского интерфейса, который, как я ожидал, не занимал так много времени.

...