【问题标题】:simulate crontab with twisted deferred and looping calls使用扭曲的延迟和循环调用模拟 crontab
【发布时间】:2015-05-28 18:11:21
【问题描述】:

我想用我的扭曲应用程序实现类似 cron 的行为。 我想触发一个定期调用(比如说每周),但只在一个精确的时间运行,而不是在我启动我的应用程序时运行。

我的用例如下: 我的 python 应用程序在一周中的任何时间启动。我希望每周一早上 8 点进行通话。 但我不想执行主动等待(使用 time.sleep()),我想使用 callLater 在下周一触发呼叫,然后从该日期开始循环呼叫。

有什么想法/建议吗? 谢谢, J.

【问题讨论】:

    标签: python cron twisted scheduler


    【解决方案1】:

    如果您绝对喜欢 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()
    

    【讨论】:

    • 谢谢,这正是我需要的。
    【解决方案2】:

    如果我正确理解了您的问题,您正在考虑首次执行计划任务以及如何为应用提供初始启动时间。如果是这种情况,您只需要以秒为单位计算 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()
    

    【讨论】:

    • 我知道不使用 datetime.timedelta 进行这些计算是一种不好的做法,但我遇到了将负值转换为正值的好方法。请原谅。
    • 嘿,非常感谢,我会尝试您的解决方案,并让您知道它是否有效。非常感谢您如此迅速地帮助我。
    • 你好,我试过你的方法,效果很好,谢谢。但是使用 parse-crontab 更紧凑,(参见上面 fmoo 的答案)
    猜你喜欢
    • 2011-11-08
    • 2011-05-31
    • 2014-07-13
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 2013-04-27
    相关资源
    最近更新 更多