【问题标题】:APScheduler not starting?APScheduler 没有启动?
【发布时间】:2011-04-29 18:00:41
【问题描述】:

我想在晚上运行一个 python 脚本,所以我正在考虑使用 APScheduler。我会在第二天凌晨 1 点开始运行它,它会每晚运行一次

我的调度程序脚本如下所示(scheduler.py):

from apscheduler.scheduler import Scheduler
from datetime import datetime, timedelta, time, date

def myScript():
    print "ok"

if __name__ == '__main__':
    sched = Scheduler()
    startDate = datetime.combine(date.today() + timedelta(days=1),time(1))
    sched.start()
    sched.add_interval_job(myScript, start_date = startDate, days=1)

在 shell 中,我这样做: python myScheduler.py & disown(我在远程运行它,所以我想在后台运行它并拒绝它。 立即,一个数字(PID)出现在该行下方,就像其他所有 python 脚本一样。但是当我做 ps -e | grep python,那个数字不存在。我尝试做kill -9 PID,但我收到一条消息说该工作不存在。

调度程序是否正在运行?如果是,我该如何阻止它?如果没有,我做错了什么?

【问题讨论】:

    标签: python scheduler


    【解决方案1】:

    您必须保持脚本运行,否则在sched.add_interval_job(myScript, start_date = startDate, days=1) 之后,脚本将结束并停止。 添加一个

    import time
    
    while True:
        time.sleep(10)
    sched.shutdown()
    

    在此之后,调度程序仍将处于活动状态。

    【讨论】:

    • 正是我需要的!谢谢你塞德里克!
    • 为什么需要 sched.shutdown()?它会被击中吗?
    • @cssndrx :如果您在控制台中启动应用程序(不带 &),您将能够通过按 Ctrl + C 来停止它,那么在这种情况下将到达 sched.shutdown()
    • @CédricJulien 哦,太好了!这是为什么呢?
    【解决方案2】:

    正确的解决方案是告诉调度程序不要作为守护进程运行:

    sched = Scheduler()
    sched.daemonic = False
    

    sched = Scheduler()
    sched.configure({'apscheduler.daemonic': False})
    

    【讨论】:

    • 我喜欢这个解决方案,但是如果没有sudo kill pid,就无法终止进程,有什么建议吗?
    • 在最新版本的apscheduler中是daemon而不是daemonicscheduler.configure({'apscheduler.daemon': False}) 为我工作
    【解决方案3】:

    这是我的方式:

    from apscheduler.scheduler import Scheduler
    def mainjob():
        print("It works!")
    
    if __name__ == '__main__':
        sched = Scheduler()
        sched.start()
        sched.add_interval_job(mainjob,minutes=1)
        input("Press enter to exit.")
        sched.shutdown()
    

    【讨论】:

      【解决方案4】:

      我已经安装了 apscheduler v3,这就是我要做的。

      from apscheduler.schedulers.background import BackgroundScheduler  
      def mainjob():
          print("It works!")
      
      if __name__ == '__main__':
          sched = BackgroundScheduler()
          sched.start()
          sched.add_job(mainjob, 'interval', seconds=120)
          input("Press enter to exit.")
          sched.shutdown() 
      

      【讨论】:

        【解决方案5】:

        如果您使用 2.1.0 版本,您还可以将 Standalone=True 参数传递给 Scheduler 构造函数。详细文档可见here

        from apscheduler.scheduler import Scheduler
        from datetime import datetime, timedelta, time, date
        
        def myScript():
            print "ok"
        
        if __name__ == '__main__':
            sched = Scheduler(standalone=True)
            startDate = datetime.combine(date.today() + timedelta(days=1),time(1))
            sched.add_interval_job(myScript, start_date = startDate, days=1)
            sched.start()
        

        【讨论】:

        • 但是要运行一个独立的服务,它应该有一个永无止境的工作。否则调度程序将结束执行。此外,它会阻塞您的主线程,当您在启动调度程序后添加其他作业时,它实际上会变得很痛苦。
        【解决方案6】:

        我认为你现在应该使用blocking scheduler

        from apscheduler.schedulers.blocking import BlockingScheduler
        
        scheduler = BlockingScheduler()
        # scheduler.add_job(...)
        scheduler.add_interval_job(myScript, start_date = startDate, days=1)
        scheduler.start()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-16
          • 2021-12-29
          • 1970-01-01
          相关资源
          最近更新 更多