Запускать функцию в начале каждого раунда с 5-минутным интервалом - PullRequest
0 голосов
/ 31 октября 2019

Я хочу запускать функцию каждые 5 минут, она должна быть с "круглыми" интервалами, например:

12:05:00, 12:10:00, 12:15:00...

Это не может быть так:

12:06:00, 12:11:00, 12:16:00...

Или вот так:

12:05:14, 12:10:14, 12:15:14...

Какой самый точный способ сделать это в python?

Ответы [ 3 ]

1 голос
/ 31 октября 2019

Вы можете использовать threading.Timer. Вы должны сделать некоторую математику, чтобы рассчитать время следующего запуска. datetime имеет удобный метод replace для этого.

from datetime import datetime, timedelta
from threading import Timer

def get_sleep_time():
    now = datetime.now()
    next_run = now.replace(minute=int(now.minute / 5) * 5, second=0, microsecond=0) + timedelta(minutes=5)
    return (next_run - now).total_seconds()

def dowork():
    now = datetime.now()
    print('Doing some work at', now)
    schedule_next_run()

def schedule_next_run():
    sleep_time = get_sleep_time()
    print(f'sleeping for {sleep_time} seconds')
    t = Timer(sleep_time, dowork)
    t.daemon = True
    t.start()


print('Starting work schedule')
schedule_next_run()
input('Doing work every 5 minutes. Press enter to exit')

В моей системе функция срабатывает в течение половины миллисекунды от целевого времени

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

Предложение : переместите всю эту логику в класс, чтобы очистить ее.

1 голос
/ 31 октября 2019
import datetime, time

def some_function():

ran_once = True

while True:
    current_time = datetime.datetime.now()
    if  current_time.minute % 5 == 0 and current_time.second % 60 == 0 and not ran_once:
        print(current_time) # DO YOUR WORK HERE
        ran_once = True

    elif current_time.minute % 5 == 0 or current_time.second % 60 != 0:

        if current_time.second % 60 == 0:
            print("Time to wait:", 5 - (current_time.minute % 5), "minutes and 0 seconds")
        else:
            print("Time to wait:", 4 - (current_time.minute % 5), "minutes and ", end="")
            print(60 - (current_time.second % 60), "seconds")

        time.sleep( (4 -(current_time.minute % 5))*60 + 60 -(current_time.second % 60))

        ran_once = False

Приведенный выше код выполняется с интервалом в 5 минут. Первоначально основной поток спит в течение количества секунд, необходимых для достижения идеальной отметки времени. Например, если программа запускается в 7:28:30, то она будет спать в течение 90 секунд, а затем начнется в 7:30:00. С этого момента он будет ждать 5 минут, прежде чем снова запустит необходимую функциональность.

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

0 голосов
/ 31 октября 2019

Вы можете использовать дату и время.

import datetime

while True:
    current_time = datetime.datetime.now()
    if current_time.second % 5 == 0 and current_time.minute % 1 == 0 and current_time.microsecond == 0:

        print(current_time)

enter image description here

надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...