2017-02-22 1 views
-1

У меня есть задание cron, которое работает в 12, 12: 30,1, 1:30. Поэтому каждые полчаса интервалы на часах. Я хочу запустить поток в моем коде python всякий раз, когда выполняется задание cron.Могу ли я установить таймер потоковой передачи с синхронизирующим временем для синхронизации с заданием cron в python

Я видел примеры, где запускать таймер каждые x секунд/mintues. Но если я запустил свой код на Python в 13:15, например, если бы я установил таймер на каждые 30 минут, то в следующий раз он будет работать в 1:45 пм. Однако я хочу, чтобы поток работал в 13:30. Это возможно?

ответ

0

Практически все возможно, настоящий вопрос - почему вы хотите это сделать? Имейте в виду, что планировщик cron не обязательно будет выполнять задания в точное время, и, кроме того, проверка времени в Python не обязательно будет соответствовать времени cron, поэтому, если вам нужно выполнить что-то в вашем Python-коде после, задание cron выполненный, вы не можете полагаться на измерение таймингов в Python - вам на самом деле нужно «обмениваться» с вашим заданием cron на ваш скрипт Python (проще всего использовать сокеты дейтаграмм)

Но, если вы хотите имитировать планировщик cron в Python , один из способов сделать это - использовать модуль datetime, чтобы получить текущее время, а затем рассчитать сумму time.sleep(), которая вам понадобится, прежде чем ваша команда снова заработает, например:

def schedule_hourly_task(task, minute=0): 
    # get hourly offset in seconds in range 1-3600 
    period = ((60 + minute) % 60) * 60 or 3600 
    while True: 
     # get current time 
     current = datetime.datetime.now() 
     # count number of seconds in the current hour 
     offset = (current - current.replace(minute=0, second=0, microsecond=0)).total_seconds() 
     # calculate number of seconds til next period 
     sleep = period - offset % period 
     if offset + sleep > 3600: # ensure sleep times apply to full hours only 
      sleep += 3600 % period 
     # sleep until the next period 
     time.sleep(sleep) 
     # run the task, break the loop and exit the scheduler if `False` is returned 
     if not task(): 
      return 

Затем вы можете использовать его для выполнения любой задачи, которую вы хотите, при любом смещении full_hour + minute. Например:

counter = 0 
def your_task(): 
    global counter 
    counter += 1 
    if counter > 2: 
     return False 
    return True 

schedule_hourly_task(your_task, 15) 

И он будет выполнять функцию your_task() каждые 15 минут, пока your_task() возвращается False - в этом случае на hh:15, hh:30 и hh:45 перед выходом. В вашем случае по телефону schedule_hourly_task(your_task, 30) вызовет функцию your_task() каждые полные 30 минут до тех пор, пока your_task() не вернет True.

Смежные вопросы