ПИТОН: Как выполнить набор инструкций в заранее определенное время - PullRequest
3 голосов
/ 27 февраля 2012

У меня есть набор инструкций, скажем, {I}, и я хотел бы выполнить этот набор {I} в заранее определенное время, например, каждую минуту. Я не спрашиваю, как вставить задержку в 1 минуту между последовательным выполнением набор {I}, я хочу запускать инструкции {I} каждую минуту независимо от времени выполнения {I}.

Если я понимаю следующий код


import time

while True:
   {I}
   time.sleep(60)

просто вставит задержку в 60 секунд между окончанием выполнения {I} и следующим. Это правда? Вместо этого я хотел бы, чтобы набор инструкций {I} запускался каждую минуту (например, в 9.00, 9.01, 9.02 и т. Д.).

Возможно ли выполнить такую ​​задачу внутри python или предпочтительнее написать скрипт с {I}, который я выполняю каждую минуту, например, с помощью Crontab? Заранее спасибо

Ответы [ 5 ]

2 голосов
/ 27 февраля 2012

Что-то вроде APScheduler может удовлетворить ваши потребности.Я уверен, что есть и другие подобные пакеты.

2 голосов
/ 27 февраля 2012

Похоже, signal.alarm и signal.signal(signal.SIGALRM, handler) должны помочь вам.

2 голосов
/ 27 февраля 2012

Если вам не нужно более точное разрешение, чем минута, cron будет самым простым вариантом. В противном случае вы бы переписали что-то вроде этого.

Если вам нужны интервалы короче минуты, вы можете рассмотреть «тайм-ауты» из библиотеки glib . У него есть привязки Python. Тайм-аут должен, вероятно, запустить задачу в отдельном процессе.

0 голосов
/ 27 февраля 2012

Вы можете порождать поток каждую секунду, используя threading.Timer :

import threading
import time

def do_stuff(count):
    print(count)
    if c < 10: # Let's build in some way to quit
        t = threading.Timer(1.0, do_stuff, args=[count+1])
        t.start()

t = threading.Timer(0.0, do_stuff, args=[0])
t.start()
t.join()

Использование модуля sched - еще одна возможность, но учтите, что метод sched.scheduler.run блокирует основной процесс до тех пор, пока очередь событий не станет пустой. (Поэтому, если функция do_stuff занимает больше секунды, следующее событие не будет выполнено вовремя.) Если вы хотите неблокирующие события, используйте threading.Timer.

0 голосов
/ 27 февраля 2012

Скорее всего, вам придется создавать отдельные потоки для каждой инструкции, выполняемой одновременно, и просто отправлять их в задержанном цикле while.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...