@judywb

Как заупстить асинхронный цикл вне основного потока?

Мне надо, чтоб каждый 10 секунд бот закреплял сообщение из массива, как мне вызвать асинхронную функцию
await scheduler.add_job(loop, 'interval', seconds=10)
? При моём подходе выскакивает ошибка
TypeError: func must be a callable or a textual reference to one
. Если await не писать, то будет ошибка, говорящая что не смогла запустить функцию loop.
Как мне заупстить функцию асинхронную loop вне основного потока?

from apscheduler.schedulers.background import BackgroundScheduler
async def loop():
    try:
        for msg in config.PINNABLE:
            try:
                await bot.pin_chat_message(msg.chat.id, msg.message_id)
            except:
                pass
    except:
        pass

bot = Bot(token=config.API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)


async def main():
    scheduler = BackgroundScheduler()
    await scheduler.add_job(loop, 'interval', seconds=10)
    await scheduler.start()

loop = asyncio.get_event_loop()
loop.ta(main())


if __name__ == '__main__':
    from handlers import dp
    executor.start_polling(dp, skip_updates=True)
  • Вопрос задан
  • 101 просмотр
Пригласить эксперта
Ответы на вопрос 1
@nedland
Может за ответ и не пойдет, но если тебе нужно, чтобы каждые 10 секунд выполнялась асинхронная функция, то я бы это делал с помощью asyncio

import asyncio

async def example():
    while True:

        #ТУТ ВЫПОЛНЯЙ ЛЮБЫЕ ДЕЙСТВИЯ, КОТОРЫЕ БУДУТ ПОВТОРЯТСЯ В ЗАДАНОМ ИНТЕРВАЛЕ (интервал ниже)

        await asyncio.sleep(10) #10 СЕКУНД 

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.create_task(example())


Работает самостоятельно, как ты говоришь "вне основного цикла"
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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