繁体   English   中英

如何使用APScheduler安排间隔作业?

[英]How do I schedule an interval job with APScheduler?

我正在尝试使用APScheduler(v3.0.0)安排间隔作业。

我试过了:

from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()

def my_interval_job():
    print 'Hello World!'
sched.add_job(my_interval_job, 'interval', seconds=5)
sched.start()

from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()

@sched.scheduled_job('interval', id='my_job_id', seconds=5)
def my_interval_job():
    print 'Hello World!'
sched.start()

要么应该根据文档工作,但工作永远不会发生......


更新:
事实证明,还有一些与环境相关的东西阻止了任务的运行。 今天早上,任务工作正常,没有对昨天的代码进行任何修改。


更新2:
经过进一步的测试,我发现“间隔”工作似乎一般都不稳定......上面的代码现在可以在我的开发环境中运行,但是当我部署到staging环境时(我正在使用heroku应用程序进行分段) )。 我还有其他的apscheduler'cron'工作,可以在升级/生产环境中正常工作。

当我打开“apscheduler.schedulers”记录器的DEBUG日志记录时,日志表明添加了间隔作业:

将作业“my_cron_job1”添加到作业存储“默认”
将作业“my_cron_job2”添加到作业存储“默认”
将作业“my_interval_job”添加到作业存储“默认”
调度程序已启动
暂时添加作业 - 将在调度程序启动时正确调度
暂时添加作业 - 将在调度程序启动时正确调度
寻找工作要跑
下次唤醒将于2015-03-24 15:05:00-07:00( 254.210542秒到期

当间隔作业设置为5秒时,下一次唤醒怎么能从现在起254秒?

我还没弄清楚导致原始问题的原因,但我通过交换安排作业的顺序来解决这个问题,以便在'cron'作业之前安排'间隔'作业。

即我改变了:

def my_cron_job1():
    print "cron job 1"

def my_cron_job2():
    print "cron job 2"

def my_interval_job():
    print "interval job"

if __name__ == '__main__':
    from apscheduler.schedulers.blocking import BlockingScheduler
    sched = BlockingScheduler(timezone='MST')

    sched.add_job(my_cron_job1, 'cron', id='my_cron_job1', minute=10)
    sched.add_job(my_cron_job2, 'cron', id='my_cron_job2', minute=20)

    sched.add_job(my_interval_job, 'interval', id='my_job_id', seconds=5)

对此:

def my_cron_job1():
    print "cron job 1"

def my_cron_job2():
    print "cron job 2"

def my_interval_job():
    print "interval job"

if __name__ == '__main__':
    from apscheduler.schedulers.blocking import BlockingScheduler
    sched = BlockingScheduler(timezone='MST')

    sched.add_job(my_interval_job, 'interval', id='my_job_id', seconds=5)

    sched.add_job(my_cron_job1, 'cron', id='my_cron_job1', minute=10)
    sched.add_job(my_cron_job2, 'cron', id='my_cron_job2', minute=20)

现在,两个环境中的cron作业和间隔作业都没有问题。

你需要保持线程活着。 这是我如何使用它的一个例子。

from subprocess import call

import time
import os

from apscheduler.schedulers.background import BackgroundScheduler


def job():
    print("In job")
    call(['python', 'scheduler/main.py'])


if __name__ == '__main__':
    scheduler = BackgroundScheduler()
    scheduler.configure(timezone=utc)
    scheduler.add_job(job, 'interval', seconds=10)
    scheduler.add
    scheduler.start()
    print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))

    try:
        # This is here to simulate application activity (which keeps the main thread alive).
        while True:
            time.sleep(5)
    except (KeyboardInterrupt, SystemExit):
        # Not strictly necessary if daemonic mode is enabled but should be done if possible
        scheduler.shutdown()

那里的文档有错误。 我现在修好了。 第一行应该是:

from apscheduler.schedulers.blocking import BlockingScheduler

但它会引发一个ImportError,但你没有提到任何。 你试过任何提供的例子吗?

好的,我查看了更新的问题。

您遇到问题的原因可能是您可能使用了错误的时区。 您所在的国家/地区目前在大多数地方都使用夏令时,因此正确的时区可能是MDT(Mountain Daylight Time)。 但是当你回到标准时间时,这会再次破裂。 所以我建议你使用像“美国/丹佛”这样的时区。 这将照顾DST开关。

问题:您使用的是CentOS吗? 到目前为止,它是唯一一种无法自动检测本地时区的操作系统。

当间隔作业设置为5秒时,下一次唤醒怎么能从现在起254秒?

这很简单:由于您的大部分工作未在间隔时间窗口内完成,因此您有许多待处理的执行。

您可以使用以下参数对此进行排序:

 **misfire_grace_time**:    Maximum time in seconds for the job execution to be allowed to delay before it is considered a misfire 
 **coalesce**:  Roll several pending executions of jobs into one

要了解更多信息,请查看此处的文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM