Как сделать один запрос раз в час, другой раз в 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 шт):
Если вам не прямо с точностью до секунды нужно каждый час и каждые сутки, то это возможно с помощью того же упомянутого вами модуля 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
Для этого в 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. Более подробно можно прочитать здесь