@ivan9727

Как запустить фоновую задачу?

Всем привет ребят кто на пальцах может обьяснить как запустить фоновую задачу? Есть бот на aiogram при команде он запускает парсер:
@dp.message_handler(Text(equals='Запуск парсера '))
async def accounts(message:types.Message):
    await message.bot.send_message(message.from_user.id, "запускаю парсер")
    await applications_parser.main(message = message)

main
async def main(message)-> None:
    user_id = message.chat.id
    user_agent = FakeUserAgent().random
    data = BotDB.get_account(user_id=user_id)
    for row in data:
        login_n = row[2]
        password_n = row[3]
    parser = Parser( login = login_n ,user_id=user_id, password = password_n, user_agent=user_agent)
    parser.get_first_start_parser()
    await parser.get_update_aplications()

Дальше бот начинает троит и может по долгу обрабатывать команды, как исправить это? Так как парсер работает постоянно обновляя информацию каждые 30 секунд. Если возможно распишите пожалуйста на пальцах. А то уже который день ломаю голову
  • Вопрос задан
  • 374 просмотра
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Когда ты делаешь await, ты говоришь "останови работу данной корутины, дождись, пока не закончится операция после await, потом продолжи работу". Пока одна корутина остановлена, другие могут выполняться. В общем, почитай про то, как работает асинхронная программа.
Если тебе нужно запустить корутину, не дожидаясь её завершения, asyncio.create_task() в помощь.

Стоит понимать, что код, который ты запускаешь через asyncio.create_task(), должен тоже быть асинхронный! Если ты завернёшь обычный синхронный вызов в корутину, и запустишь её через create_task(), чуда не будет - бот всё равно встанет колом, пока вызов не закончится.
Так что взгляни лучше на свой парсер - если он основан на синхронной библиотеке типа requests, перепиши его на aiohttp.
Ответ написан
Ваш ответ на вопрос

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

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