Почему у меня не создаться задача?

Я недавно начала изучать асинхронное программирование, и столкнулась с такой проблемой, в цикле не создаёться task

import asyncio

async def cola():
    for i in range(100):
        await asyncio.sleep(0.01)
    print("cola")

async def burger():
    for i in range(1000):
        await asyncio.sleep(0.01)    
    print("burger")

async def kassa():
    while True:
        command = input("закас: ")
        if command == "cola":
            asyncio.create_task(cola())
            
        elif command == "burger":
            asyncio.create_task(burger())
            

async def main():
    asyncio.create_task(kassa())

loop = asyncio.new_event_loop()
loop.run_until_complete(main())
loop.run_forever()


но если убрать цикл то всё работает корректно
import asyncio

async def cola():
    for i in range(100):
        await asyncio.sleep(0.01)
    print("cola")

async def burger():
    for i in range(1000):
        await asyncio.sleep(0.01)    
    print("burger")

async def kassa():
        command = input("закас: ")
        if command == "cola":
            asyncio.create_task(cola())
            
        elif command == "burger":
            asyncio.create_task(burger())
            

async def main():
    asyncio.create_task(kassa())

loop = asyncio.new_event_loop()
loop.run_until_complete(main())
loop.run_forever()
  • Вопрос задан
  • 100 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Асинхронные задачи исполняются циклом событий, который нельзя останавливать, а ваш бесконечный while как раз это и делает.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Подозреваю, что дело в синхронном input(). Пока код стоит в нём, другие корутины не выполняются.
В прииинципе можешь схитрить и использовать run_in_executor().
Грубо говоря, он позволяет вынести длительный синхронный код в отдельный поток, и завернуть это в обычный task. Так что с точки зрения остальной програмы код становится как бы асинхронным.

EDIT: а ещё есть пакет aioconsole - как раз для таких вещей.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы