Запуск функции 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")

Он будет печатать "Выполнение задания_функции" каждую минуту