Вы найдете множество полезных функций в модуле datetime
:
from datetime import datetime, timedelta
# Bootstrap by getting the most recent time that had minutes as a multiple of 5
time_now = datetime.utcnow() # Or .now() for local time
prev_minute = time_now.minute - (time_now.minute % 5)
time_rounded = time_now.replace(minute=prev_minute, second=0, microsecond=0)
while True:
# Wait until next 5 minute time
time_rounded += timedelta(minutes=5)
time_to_wait = (time_rounded - datetime.utcnow()).total_seconds()
time.sleep(time_to_wait)
# Now do whatever you want
do_my_thing()
Обратите внимание, что когда вызывается do_my_thing()
, это будет на самом деле дробно после точного времени в time_to_round
, потому что, очевидно, компьютеры не могут работать точно в нулевое время. Это гарантированно не проснется до этого времени, хотя. Если вы хотите сослаться на «текущее время» в do_my_thing()
, передайте переменную time_rounded
, чтобы получить точные метки времени в файле журнала.
В приведенном выше коде я намеренно пересчитал time_to_wait
каждый раз, вместо того, чтобы просто установить его на 5 минут после первого раза. Это связано с тем, что небольшая задержка, о которой я только что упомянул, не приводит к постепенному росту снежного кома после долгого запуска сценария.