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

2024-05-14 06:38:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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()

两者都应该根据the docs工作,但该作业从不激发。。。


更新:
结果发现还有一些与环境相关的东西阻止了任务的运行。今天早上,任务运行良好,没有对昨天的代码进行任何修改。


更新2:
经过进一步的测试,我发现“间隔”的工作似乎通常是不稳定的。。。上面的代码现在可以在我的开发环境中工作,但当我部署到一个staging env(我使用heroku应用程序进行staging)时就不行了。我还有其他apscheduler“cron”作业,它们在staging/production环境中工作得很好。

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

Added job "my_cron_job1" to job store "default"
Added job "my_cron_job2" to job store "default"
Added job "my_interval_job" to job store "default"
Scheduler started
Adding job tentatively -- it will be properly scheduled when the scheduler starts
Adding job tentatively -- it will be properly scheduled when the scheduler starts
Looking for jobs to run
Next wakeup is due at 2015-03-24 15:05:00-07:00 (in 254.210542 seconds)

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


Tags: theto间隔my作业jobcronseconds
3条回答

你需要让这根线活下来。这是我如何使用它的一个例子。

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()

我还没有弄清楚是什么导致了最初的问题,但是我通过交换作业的调度顺序来解决了这个问题,因此“interval”作业在“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作业和interval作业在这两个环境中都可以正常运行。

文档中有一个错误。我已经修好了。 第一行应该是:

from apscheduler.schedulers.blocking import BlockingScheduler

不过,这会引起一场严重的恐慌,但你什么也没提。 你试过任何提供的examples吗?

相关问题 更多 >