Как сделать один запрос раз в час, другой раз в 24 часа

Каким способом я могу сделать в скрипте, который работает безперерывно,один запрос раз в час, а другой раз в 24 часа.

def main():
    while True:
        requests.post(url, headers = auth, data = msg_work)
        requests.post(url, headers = auth, data = msg_daily)

if __name__ == '__main__':
    main()

Мне надо, чтобы запрос с msg_work выполнялся раз в час, а запрос с msg_daily раз в 24 часа. Я думал это реализовать как- то через time.sleep() но так и не придумал каким образом я могу это сделать

upd

Реализовал всё таки это через time.sleep()

def main():
    hours_passed = 0
    while True:
        if hours_passed == 0:  # a day has passed
            requests.post(url, headers = auth, data = msg_daily)
            print(f'Daily success? {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
        requests.post(url, headers = auth, data = msg_work)
        print(f'Work success⛏ {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
        hours_passed = (hours_passed + 1) % 24
        time.sleep(3600)  # it will sleep for a hour
        
if __name__ == '__main__':
    main()

Но буду переделывать через @tasks.loop() так как выглядит более лаконично


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

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

Если вам не прямо с точностью до секунды нужно каждый час и каждые сутки, то это возможно с помощью того же упомянутого вами модуля time.

Выполняем запрос с msg_work и сохраняем время, в которое он был выполнен. Выполняем запрос с msg_daily и сохраняем время, в которое он был выполнен. В бесконечном цикле при каждой итерации считываем время сейчас. Если оно больше на 3600 секунд (1 час), чем время последнего запроса msg_work, то снова выполняем запрос msg_work, если время сейчас больше на 86400 секунд (1 сутки), чем время запроса запроса msg_daily, то выполняем запрос msg_daily. Время считывается в формате UNIX, т.е. число прошедших секунд с 00:00:00 UTC 1 января 1970 года.

import time


requests.post(url, headers=auth, data=msg_work)
last_work_time = time.time()
requests.post(url, headers=auth, data=msg_daily)
last_daily_time = time.time()
while True:
    time_now = time.time()
    if time_now-last_work_time >= 3600: # прошло 3600 или больше секунд (1 час)
        requests.post(url, headers=auth, data=msg_work)
        last_work_time = time_now # меняем последнее время выполнения для msg_work
    elif time_now-last_daily_time >= 86400: # прошло 86400 или больше секунд (1 сутки)
        requests.post(url, headers=auth, data=msg_daily)
        last_daily_time = time_now # меняем последнее время выполнения для msg_daily
→ Ссылка
Автор решения: nyekitka

Для этого в discord py есть такая штука, как декоратор @tasks.loop(). Нужную вам асинхронную функцию вы должны обернуть в этот декоратор и указать с какой частотой эта функция будет выполняться. Например, пусть бот посылает сообщение в какой-то канал раз в сутки:

from discord.ext import tasks

@tasks.loop(hours=24)
async def write_a_message():
   await channel.send('Hello world!')

Время можно указывать не только в часах, но и в секундах и в минутах, для этого есть соответствующие параметры minutes и seconds. Более подробно можно прочитать здесь

→ Ссылка