Задать вопрос
@kkolorid

Почему бот на aiogram молчит, пока выполняет действия?

Почему бот на aiogram молчит для меня или других пользователей, пока он выполняет логику по нажатию кнопки, например? Он же должен работать асинхронно. Что я мог сломать?

Логика организована примерно так:

Вот более полный код:
#импорты

ngrok.set_auth_token(NGROK_TOKEN)
http_tunnel = ngrok.connect(5000, bind_tls=True)

# webhook settings

WEBHOOK_HOST = http_tunnel.public_url
WEBHOOK_PATH = ''
WEBHOOK_URL = f"{WEBHOOK_HOST}{WEBHOOK_PATH}"

# webserver settings
WEBAPP_HOST = 'localhost' # or ip
WEBAPP_PORT = 5000

# Настройки логирования
now = datetime.datetime.now()
file_log = logging.FileHandler('./logs/{}-{}.log'.format(now.strftime("%Y-%m-%d"), now.strftime("%H:%M:%S")))
console_out = logging.StreamHandler()
logging.basicConfig(handlers=(file_log, console_out), format=u'%(filename)+13s [ LINE:%(lineno)-4s] %(levelname)-8s [%(asctime)s] %(message)s', level=logging.DEBUG)

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot, storage=MemoryStorage())
dp.middleware.setup(LoggingMiddleware())

@dp.message_handler(commands=['buy'])
async def command(message: types.Message):
    await message.delete() # удаляем сообщение, на которое поступил ответ
    if not RANSOM:
        ############
    else:
        data = message.get_args().split(' ')

        await message.answer('Ожидайте...')
        await asyncio.sleep(20)

### Запуск бота
async def on_startup(dp):
    await bot.set_webhook(WEBHOOK_URL)
    # insert code here to run it after start

### Остановка бота
async def on_shutdown(dp):
    logging.warning('Shutting down..')

    # insert code here to run it before shutdown

    # Remove webhook (not acceptable in some cases)
    await bot.delete_webhook()

    # Close DB connection (if used)
    await dp.storage.close()
    await dp.storage.wait_closed()

    ngrok.disconnect(http_tunnel.public_url)

    logging.warning('Bye!')


if __name__ == '__main__':
    start_webhook(
        dispatcher=dp,
        webhook_path=WEBHOOK_PATH,
        on_startup=on_startup,
        on_shutdown=on_shutdown,
        skip_updates=True,
        host=WEBAPP_HOST,
        port=WEBAPP_PORT,
    )


sleep делаю для примера, пока бот ждет 20 секунд, ни мне, ни другим пользователям он не отвечает. Почему так? Может это быть из-за того что я к БД нативно обращаюсь?
  • Вопрос задан
  • 392 просмотра
Подписаться 3 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
asyncio sleeping
sleep() always suspends the current task, allowing other tasks to run.

Наглядный пример выполнения
Код
import asyncio
import time


async def test(delay: int, number: int):
    print(f"Задача: {number}\n"
          f"Начато выполнение в {time.strftime('%X')}\n"
          f"Ждем {delay} секунд")
    await asyncio.sleep(delay)
    print(f"Закончили задачу {number} в {time.strftime('%X')}")


async def startup():
    delays = [10, 8, 14, 5]
    for i, x in enumerate(delays):
        await test(x, i + 1)


if __name__ == '__main__':
    asyncio.run(startup())

Вывод
Задача: 1
Начато выполнение в 01:47:05
Ждем 10 секунд
Закончили задачу 1 в 01:47:15
Задача: 2
Начато выполнение в 01:47:15
Ждем 8 секунд
Закончили задачу 2 в 01:47:23
Задача: 3
Начато выполнение в 01:47:23
Ждем 14 секунд
Закончили задачу 3 в 01:47:37
Задача: 4
Начато выполнение в 01:47:37
Ждем 5 секунд
Закончили задачу 4 в 01:47:42

Можете считать, что в данном случае await asyncio.sleep(delay) является блокирующей функцией
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы