Вам нужно запустить потребителя и производителя параллельно, например, определив main
следующим образом:
async def main():
queue = asyncio.Queue()
await asyncio.gather(consumer(queue), producer(queue, 1))
Если по какой-то причине вы не можете использовать gather
, тогда вы можете сделать (эквивалент) this:
async def main():
queue = asyncio.Queue()
asyncio.create_task(consumer(queue))
asyncio.create_task(producer(queue, 1))
await asyncio.sleep(100) # what your program actually does
Почему await queue.get()
не возвращает управление в цикл событий, чтобы можно было запустить сопрограмму производителя, которая заполнит очередь, так что queue.get()
можетreturn.
await queue.get()
означает , возвращая управление обратно в цикл обработки событий.Но await означает wait , поэтому, когда ваша main
сопрограмма говорит await consumer(queue)
, это означает «возобновите меня, как только consumer(queue)
завершится».Поскольку consumer(queue)
сам ожидает, что кто-то что-то произведет, у вас есть классический случай тупика.
Изменение порядка срабатывания работает только потому, что ваш продюсер однократный, поэтому он немедленно возвращается к вызывающей стороне.Если бы ваш продюсер ожидал внешнего источника (например, сокета), у вас тоже была бы тупиковая ситуация.Параллельный запуск их позволяет избежать тупика независимо от того, как написаны producer
и consumer
.