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

У меня есть цикл Python, который должен запускаться каждую минуту, выполнять некоторую обработку данных и спать до следующей минуты. Однако обработка занимает переменное количество времени, иногда она близка к нулю, когда делать нечего, иногда это занимает даже 10 или 20 секунд.

Чтобы компенсировать это, я измеряю время, необходимое для запуска обработки, следующим образом:

while True:
  time_start = time.time()
  do_something()                        # <-- This takes unknown time
  time_spent = time.time() - time_start
  time.sleep(60 - time_spent)

Это работает, но через пару дней все еще уходит на несколькосекунд. Я предполагаю, что это происходит, когда компьютер (маленький Raspberry Pi) занят и задерживает начало цикла, а затем все начинает ускользать.

Мне не нужно do_something() исполнено точно каждую минуту, поэтому нет необходимости в ОС реального времени или чем-то подобном, но я не хочу, чтобы один отложенный запуск влиял на все последующие.

Есть ли какой-то планировщик, который может запускать мою функциюпо заранее установленному тарифу? Или какой-нибудь более умный способ компенсировать случайные задержки?

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

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

rate_sec = 60
time_start = time.time()

while True:
    print("{}".format(datetime.now()))

    # Emulate processing time 0s to 20s
    time.sleep(random.randint(0, 20))

    # Sleep until the next 'rate_sec' multiple
    delay = rate_sec - (time.time() - time_start) % rate_sec
    time.sleep(delay)
0 голосов
/ 04 ноября 2019

Является ли сон необходимым условием вашего проекта? Я имею в виду, вам не нужно блокировать обработку, если вы хотите запускать задачу каждую ~ 1 минуту.

Поскольку вы используете Raspberry Pi, вы можете (и, вероятно, должны) использовать crontab.

Это даст вам максимальную гибкость и позволит вам не спать бездействующим компьютером.

Для этого откройте вкладку cron с помощью

crontab -e

И добавьте следующую запись

* * * * * /usr/bin/env python3 /path/to/script.py
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...