Это приводит к тому, что производитель помещает все свои предметы в очередь, и только тогда потребитель получает возможность их снять.Это ожидается?
Да.Проблема в том, что ваша очередь не ограничена, поэтому помещение чего-либо в нее никогда не приостанавливает продюсера и, следовательно, никогда не уступает другим сопрограммам.То же самое относится ко всем ожиданиям, которые немедленно предоставляют данные, например, , считанное в EOF .
Если цикл производителя содержал другой источник приостановки, такой как ожидание фактического ввода (он должен получитьв конце концов, из-за чего-то, что это приостановит, и проблема не будет сразу заметна.Принудительная приостановка, использующая asyncio.sleep(0)
, также работает, но она хрупкая, потому что для запуска потребителя используется одна подвеска.Это может не всегда иметь место, поскольку потребитель сам может ожидать некоторые события, отличные от очереди.
Неограниченная очередь имеет смысл в некоторых ситуациях, например, когда очередь предварительно заполнена задачами, илиархитектура производителя ограничивает количество предметов разумным количеством.Но если элементы очереди генерируются динамически, лучше добавить границу.Ограничение гарантирует обратное давление на производителя и гарантирует, что оно не монополизирует цикл обработки событий.