2015-12-30 7 views
3

У меня есть требование, когда мне нужно запускать задачу каждые 5 секунд, но только между конкретными временами (например, между 1:30 и 2:30 завтра).Как запустить задачу в python для регулярных интервалов между определенными временами?

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

Я также посмотрел на APScheduler, но это не поддерживает запуск его как «демона» и планирование задач извне.

Любая идея, что я мог бы использовать, чтобы это произошло?

Редактировать: Следует упомянуть об этом ранее, мне нужно сделать это во время веб-запроса, как фоновая задача.

+2

Сделать работу cron? – Ashalynd

+0

Обычно это делается с использованием эквивалента 'crontab' в вашей системе (для окон использовалась команда' at', не знаю, существует ли она в последних версиях). –

ответ

2

Если я правильно понял ваш вопрос, может быть, так?

from time import sleep 
from datetime import datetime 


if 90 <= datetime.now().hour * 60 + datetime.now().minute <= 150: 
    # Do something 
    time.sleep(5) 

Я преобразовал час в минуту, чтобы облегчить время. Таким образом, 90 мин составляет 1,30, а 150 мин - 2,30. (Учитывается AM)

И модуль времени выполняет этот прогон с интервалом 5 секунд.

Если вам также нужны дни, вы можете реализовать это легко;

datetime.now().day 

И вам нужно поставить это в цикл для непрерывного тестирования состояния. Используемый метод сна приведет к проверке каждые 5 секунд.

Как вы добавили, код не может блокировать процесс. Другой способ - использовать метод разделения. Что-то вроде;

While #condition: 
    if not datetime.now().second % 5: 
     # Process 

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

+0

'sleep' не является хорошей функцией, если вам нужна точность. Он просто поместит процесс в заблокированную очередь в планировщике, а затем в готовую очередь, он не продолжит процесс ровно через 5 секунд. Для этого вы должны использовать [тактовый сигнал] (https://docs.python.org/2/library/signal.html#signal.setitimer) –

+0

Вы действительно прав. Я просто думал о том, как избежать этой проблемы. :) Но в этом примере я думаю, что он работает так, как ожидалось, учитывая, что минуты делятся на 5 – Rockybilly

+0

Спасибо. Но мне нужно запланировать задачу во время веб-запроса, она не может блокироваться. Если я запустил этот скрипт в качестве демона и получил его триггером функцию через определенные промежутки времени из веб-кода. – Scaraffe

1

Я думаю, что ответ Рокибилли довольно близок, если вы хотите полностью ответить на питон. Однако вам необходимо обернуть это в:

While True: 
#@Rockybilly's if statement 

Это необходимо для повторения процесса. Вы также хотели бы включить что-то, как здесь: delay a task until certain time

Вы бы сделали это один раз за пределами указанного вами диапазона (например, 2:31), а затем спящий сценарий до 1:30 на следующий день. Это поможет гарантировать, что он не будет постоянно работать.

Как люди отмечают, что вы можете сделать это, в том или ином качестве, используя либо CRON (Unix) или Task Scheduler (Windows)

-

Так как вы отредактировали ваш вопрос, я добавлю ответ на это редактирование здесь. Пожалуйста, см. Мой комментарий ниже, в ответ на @Rockybilly, поскольку это то, что вы можете уточнить.

Возможно, вы захотите заглянуть в threading, multiprocessing или новые модули asyncio, если они должны выполняться параллельно.

(Нельзя связать Asyncio из-за ограничений ретрансляции)

+0

Спасибо за указание, я на самом деле добавил, что несколько минут назад :) – Rockybilly

+0

@Rockybilly Я вижу это! Большой! Я не могу прокомментировать выше (не достаточно репутации), но я думаю, что г-н Е говорит в ваших комментариях, что функция будет спать в течение 5 секунд + любое время, необходимое для запуска скрипта. Таким образом, если сценарий занимает 20 секунд для запуска, это приведет к 25-секундным интервалам. Я думаю, что это то, что нужно разъяснить OP. Требуется ли ОП каждые 5 секунд? Должен ли процесс запускать каждые 5 секунд (понимание того, что результат может отличаться из-за нагрузки)? Или это требование всего лишь 5 секундного промежутка между обработкой? – disflux