Я хотел бы реализовать cron-подобное поведение с моим измененным приложением. Я хочу инициировать периодический вызов (скажем, каждую неделю), но только в точное время, а не при запуске приложения.

Мой пример использования следующий: моё приложение на python запускается в любое время недели. Я хочу, чтобы звонки выполнялись каждый понедельник в 8 утра. Но я не хочу выполнять активное ожидание (используя time.sleep ()), я хотел бы использовать callLater для запуска вызова в следующий понедельник, а затем начать зацикливание вызова с этой даты.

Любая идея / совет? спасибо, J.

0
user1151446 29 Янв 2013 в 13:57

2 ответа

Лучший ответ

Если вы абсолютно влюблены в спецификаторы в стиле cron, вы можете также использовать parse-crontab

Тогда ваш код выглядит в основном так:

from crontab import CronTab
monday_morning = CronTab("0 8 * * 1")

def do_something():
    reactor.callLater(monday_morning.next(), do_something)
    # do whatever you want!

reactor.callLater(monday_morning.next(), do_something)
reactor.run()
7
fmoo 31 Янв 2013 в 18:18

Если я правильно понял ваш вопрос, вы думаете о первом выполнении запланированного задания и о том, как указать начальное время запуска приложения. Если это так, вам просто нужно вычислить значение timedelta в секундах, которое будет передано в callLater.

import datetime
from twisted.internet import reactor

def cron_entry():
    full_weekseconds = 7*24*60*60
    print "I was called at a specified time, now you can add looping task with a full weekseconds frequency"


def get_seconds_till_next_event(isoweekday,hour,minute,second):
    now = datetime.datetime.now()
    full_weekseconds = 7*24*60*60
    schedule_weekseconds = ((((isoweekday*24)+hour)*60+minute)*60+second)
    now_weekseconds=((((now.isoweekday()*24)+now.hour)*60+now.minute)*60+now.second)

    if schedule_weekseconds > now_weekseconds:
        return schedule_weekseconds - now_weekseconds
    else:
        return  now_weekseconds - schedule_weekseconds + full_weekseconds


initial_execution_timedelta = get_seconds_till_next_event(3,2,25,1)
"""
This gets a delta in seconds between now and next Wednesday -3, 02 hours, 25 minutes and 01 second
"""
reactor.callLater(initial_execution_timedelta,cron_entry)
reactor.run()
1
jbreicis 29 Янв 2013 в 10:48