Как совершать действие каждые n минут на Python?

Всем привет! На просторах Github нашел интересный телеграм бот с игрой про ферму (вот https://github.com/AglievTim/My_farm/tree/master/Farm ). Суть проста: покупаешь животных, которые дают некое сырье раз в час в N количестве. Однако есть одна проблема. Дело в том, что в этом боте не работает прибавление ресурсов игроку раз в час (так же как и изменение цен на "Рынке", но не суть). В файле database.py я решил, что проблема кроется в отсутствии user_id, которому необходимо накидывать ресурсы. Я исправил это:

# Прибавляет ресурсы игроку
def update_products(event, user_id):
    con = sqlite3.connect(DATA, check_same_thread=False)
    cursor = con.cursor()
    cursor.execute(f'UPDATE profile_information SET eggs = eggs + chicken_count * 10 WHERE user_id = {user_id}')
    cursor.execute(f'UPDATE profile_information SET wool = wool + sheep_count * 10 WHERE user_id = {user_id}')
    cursor.execute(f'UPDATE profile_information SET milk = milk + cow_count * 12 WHERE user_id = {user_id}')
    cursor.execute(f'UPDATE profile_information SET meat = meat + pig_count * 5 WHERE user_id = {user_id}')
    con.commit()
    con.close()

Но это не помогло. Я заглянул в functions.py и в самом конце есть код:

    def main(event):
    index = 1
    while True:
        if index % 5 == 0:
            db.change_mart()
        db.update_products()
        index += 1
        sleep(10)

Возможно проблема таится именно тут, хотел бы попросить помощи и разобраться наконец-то. Буду рад помощи, ибо с автором данного творения не нашел способа связаться.


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

Автор решения: John Barrow

В данном случае использовать time.sleep() не лучшая идея, т.к. выполнение другого кода будет остановлено. Лучшее, что я смог придумать использовать встроеный модуль threading. Выглядеть это будет примерно так:

import threading

def add_res():
    # Как-то даем ресурсы
    # И запускаем повторение функциии add_res через WAIT_SECONDS секунд
    threading.Timer(WAIT_SECONDS, add_res).start()
    
add_res() # Запускаем функию в превый раз, чтобы дальше она сама себя запускала
→ Ссылка