Запуск функции Python точно в минуту
У меня есть функция, которую я хочу запускать при каждом повороте минуты - в 00 секунд. Он запускает пакет по воздуху на немой дисплей, который будет установлен на стене.
Я знаю, что могу перетащить его с помощью цикла while, но это кажется немного суровым.
Я попытался использовать расписание, но это заканчивается добавлением секунды каждую минуту.
Каковы мои варианты?
Ответы
Ответ 1
Вы можете попробовать APScheduler, модуль планировщика cron-стиля для Python.
Из их примеров:
from apscheduler.scheduler import Scheduler
# Start the scheduler
sched = Scheduler()
sched.start()
def job_function():
print "Hello World"
sched.add_cron_job(job_function, second=0)
будет запускать job_function
каждую минуту.
Ответ 2
Что, если бы вы измерили, сколько времени потребовалось для выполнения вашего кода, и вычитали это из времени сна 60?
import time
while True:
timeBegin = time.time()
CODE(.....)
timeEnd = time.time()
timeElapsed = timeEnd - timeBegin
time.sleep(60-timeElapsed)
Ответ 3
Самое простое решение - зарегистрировать тайм-аут с истечением срока действия операционной системы, когда вы захотите.
Теперь есть несколько способов сделать это с помощью команды блокировки, и лучший вариант зависит от вашей реализации. Простейшим способом было бы использовать time.sleep()
:
import time
current_time = time.time()
time_to_sleep = 60 - (current_time % 60)
time.sleep(time_to_sleep)
Таким образом вы берете текущее время и вычисляете время, необходимое вам для сна (в секундах). Не миллисекунда точно, но достаточно близко.
Ответ 4
Модуль времени Python обычно используется для таких событий. Он имеет метод под названием sleep(t)
, где t
равно времени в секундах, которое вы хотите отложить.
В сочетании с циклом while
вы можете получить то, что ищете:
import time
while condition:
time.sleep(60)
f(x)
Ответ 5
APScheduler - правильный подход. Однако синтаксис изменился с момента первоначального ответа.
Как в APScheduler 3.3.1:
def fn():
print "Hello, world"
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
scheduler.start()
scheduler.add_job(fn, trigger='cron', second=0)
Ответ 6
вы можете использовать цикл while и sleep, чтобы не слишком много переваривать процессор
Ответ 7
Вы можете попробовать Threading.Timer
См. этот пример
from threading import Timer
def job_function():
Timer(60, job_function).start ()
print("Running job_funtion")
Он будет печатать "Выполнение задания_функции" каждую минуту