9

我正在尝试使用 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:
经过进一步测试,我发现“间隔”作业似乎通常很不稳定......上面的代码现在可以在我的开发环境中工作,但当我部署到暂存环境时(我正在使用 heroku用于分期的应用程序)。我还有其他在登台/生产环境中工作得很好的 apscheduler 'cron' 工作。

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

将作业“my_cron_job1”添加到作业存储“default” 将
作业“my_cron_job2”添加到作业存储“default” 将
作业“my_interval_job”添加到作业存储“default”
调度程序开始
暂定添加作业 - 当调度程序开始时将正确调度
添加暂定作业 - 将在调度程序启动时正确安排
寻找要运行的作业
下一次唤醒应在 2015-03-24 15:05:00-07:00 (在254.210542 秒内

当间隔作业设置为 5 秒时,下一次唤醒如何在 254 秒后到期?

4

5 回答 5

9

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

from subprocess import call

import time
import os
from pytz import utc

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.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()
于 2017-11-30T09:05:38.780 回答
5

我还没有弄清楚是什么导致了最初的问题,但我通过交换作业安排的顺序来解决它,以便在“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 作业和间隔作业在两种环境中都可以正常运行。

于 2015-03-24T23:35:48.963 回答
1

当间隔作业设置为 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

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

于 2018-12-19T16:46:16.623 回答
0

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

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

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

于 2015-03-26T00:18:58.880 回答
0

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

from apscheduler.schedulers.blocking import BlockingScheduler

虽然它会引发一个 ImportError ,但你没有提到任何。您是否尝试过任何提供的示例

于 2015-03-24T12:25:00.530 回答