Python中定时任务框架APScheduler快速入门指南(2)

3.6. 关闭调度器
 默认情况下调度器会等待所有正在运行的作业完成后,关闭所有的调度器和作业存储。如果你不想等待,可以将wait选项设置为False。

scheduler.shutdown()
 
scheduler.shutdown(wait=False)
 

4. APScheduler的代码示例

 这里使用装饰器来展示一个调度的使用:

from apscheduler.schedulers.blocking import BlockingScheduler
 
sched = BlockingScheduler()
 
@sched.scheduled_job('interval', seconds=3)
 
def timed_job():
 
print('This job is run every three minutes.')
 
@sched.scheduled_job('cron', day_of_week='mon-fri', hour='0-9', minute='30-59', second='*/3')
 
def scheduled_job():
 
print('This job is run every weekday at 5pm.')
 
print('before the start funciton')
 
sched.start()
 
print("let us figure out the situation")

代码说明:

  在这段代码中,使用了当前进程中共享计算资源的BlockingScheduler,共使用了2个调度器,其中一个是间隔3秒的执行。

另外一个调度器是模仿cron来执行的,在周一到周五其间,每天的0点到9点直接,在30分到59分之间执行,执行频次为3秒。

 基于正常代码的示例如下:

from apscheduler.schedulers.background import BackgroundScheduler
 
from apscheduler.schedulers.blocking import BlockingScheduler
 
import datetime
 
import time
 
import logging
 
def job_function():
 
print "Hello World" + " " + str(datetime.datetime.now())
 
if __name__ == '__main__':
 
log = logging.getLogger('apscheduler.executors.default')
 
log.setLevel(logging.INFO) # DEBUG
 
fmt = logging.Formatter('%(levelname)s:%(name)s:%(message)s')
 
h = logging.StreamHandler()
 
h.setFormatter(fmt)
 
log.addHandler(h)
 
print('start to do it')
 
sched = BlockingScheduler()
 
# Schedules job_function to be run on the third Friday
 
# of June, July, August, November and December at 00:00, 01:00, 02:00 and 03:00
 
sched.add_job(job_function, 'cron', day_of_week='mon-fri', hour='0-9', minute="*", second="*/4")
 
sched.start()

5. 某个异常问题的思考

 在执行以下代码之时候,定时任务一直未能正常生效:

from apscheduler.schedulers.background import BackgroundScheduler
 
from apscheduler.schedulers.blocking import BlockingScheduler
 
import datetime
 
import time
 
def job_function():
 
print "Hello World" + " " + str(datetime.datetime.now())
 
if __name__ == '__main__':
 
print('start to do it')
 
sched = BlockingScheduler()
 
sched.add_job(job_function, 'cron', day_of_week='mon-fri', hour='0-9', minute="*", second="*/4")
 
sched.start() 代码报错的错误信息为:

No handlers could be found for logger “apscheduler.scheduler”
 从字面意思来分析,是没有logging模块的logger存在,故需要添加上去即可。

 新增对应的logging信息即可:

import logging

log = logging.getLogger('apscheduler.executors.default')
    log.setLevel(logging.INFO)  # DEBUG

fmt = logging.Formatter('%(levelname)s:%(name)s:%(message)s')
    h = logging.StreamHandler()
    h.setFormatter(fmt)
    log.addHandler(h)

后来笔者重新做了一次执行,即使移除掉logging的内容,依然可以正常执行,故可以推测为需要动态引入一次依赖包logging即可。

6. 总结

APScheduler是一个非常强大易用的类库,为了我们简单快捷的解决问题提供了很多的工具,并且提供了很多灵活的扩展点,只要你添加若干的web页面,就可以创建一个强大的任务调度系统,不是吗?

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/9bcb599b02f3e7526cc075d58d96a386.html