我尝试使用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环境时(我使用heroku应用程序进行分段)。我有其他的调查员' 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秒?
答案 0 :(得分:2)
我还没弄清楚导致原始问题的原因,但是我通过交换安排工作的顺序来解决这个问题,以便“' 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作业和间隔作业都没有问题。
答案 1 :(得分:2)
你需要保持线程活着。这是我如何使用它的一个例子。
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()
答案 2 :(得分:0)
那里的文档有错误。我现在修好了。 第一行应该是:
from apscheduler.schedulers.blocking import BlockingScheduler
虽然会引发一个ImportError,但你没有提到任何问题。 您是否尝试过任何提供的examples?
答案 3 :(得分:0)
好的,我已经查看了更新的问题。
您遇到问题的原因可能是您可能使用了错误的时区。您所在的国家/地区目前在大多数地方都使用夏令时,因此正确的时区可能是MDT(Mountain Daylight Time)。但是当你回到标准时间时,这会再次破裂。所以我建议你使用像#34; America / Denver"这样的时区。这将照顾DST开关。
问题:您使用的是CentOS吗?到目前为止,它是唯一一种无法自动检测本地时区的操作系统。
答案 4 :(得分:0)
从现在起间隔254秒如何下次唤醒 作业设置为5秒?
很简单: 您有许多待处理的执行,因为您的大部分工作都没有在时间间隔内完成。
您可以使用以下参数来解决此问题:
**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
要了解更多信息,请查看文档here。