Как совместить long polling и schedule?

Есть телеграм бот, реализованный через pytelegrambotapi. Сделал таймер, который должен выполнять раз в n-секунд, но оно не отрабатывает почему-то.

def low_level_balance_timer():
    print('ax')
    users = getAllUsers()
    for user in users:
        pass
        #check balance
        # if balance low 
        # notify
    time.sleep(60)

schedule.every(10).seconds.do(low_level_balance_timer)

def main_loop():
    bot.polling(True)
    while True:
        schedule.run_pending()
        time.sleep(1)

if __name__ == '__main__':
    main_loop()

Ответы (1 шт):

Автор решения: gil9red

У вас schedule.run_pending() и bot.polling(True) работают в одном потоке и когда вы вызываете time.sleep(...), то текущий поток засыпает.

Поэтому, нужно разграничить их работу, создав второй поток, например так:

from threading import Thread


def low_level_balance_timer():
    print('ax')
    users = getAllUsers()
    for user in users:
        pass
        #check balance
        # if balance low 
        # notify
    time.sleep(60)


def do_schedule():
    schedule.every(10).seconds.do(low_level_balance_timer)

    while True:
        schedule.run_pending()
        time.sleep(1)


def main_loop():
    thread = Thread(target=do_schedule)
    thread.start()

    bot.polling(True)


if __name__ == '__main__':
    main_loop()
→ Ссылка