工作中经常需要做一些定时任务,之前基本都是用crontab来定时执行脚本,python也有一个apscheduler方便进行定时任务的管理,所以我简单学习了下apscheduler的使用。
BlockingScheduler
# coding=utf-8
from time import sleep
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
__author__ = 'chenglp'
#执行器
executors = {
'default': ThreadPoolExecutor(10),
'processpool': ProcessPoolExecutor(3),
}
import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.schedulers.background import BackgroundScheduler
import logging
logging.basicConfig()
def call_job1():
sleep(3)
print 'job1 run at %s' % datetime.datetime.now().isoformat()
def call_job2():
print 'job2 run at %s' % datetime.datetime.now().isoformat()
if __name__ == '__main__':
bs = BlockingScheduler(executors=executors)
bs.add_job(call_job1, 'interval', seconds=2, executor='processpool', max_instances=2, id='call_job1')
bs.add_job(call_job2, 'interval', seconds=2, executor='processpool')
try:
bs.start()
sleep(10)
except (KeyboardInterrupt, SystemExit):
bs.shutdown()
pass
在生成Scheduler时,可以传入很多参数,如jobstores(任务的存储方式), executors(执行方式,可以配置时线程还是进程),job_defaults(一些其他默认配置)
然后使用add_job增加任务,第二个参数可选为date(一次性指定日期);interval(在某个时间范围内间隔多长时间执行一次);cron(和unix crontab格式兼容,最为强大),这个参数决定了之后的时间如何配置。这里还指定了下executor为哪个,之前定义了default和processpool两个,
最后使用start()方法即开始定时任务,更多的操作可以查看apscheduler的官网,
TornadoScheduler
用官方的例子:
from datetime import datetime
import os
from tornado.ioloop import IOLoop
from apscheduler.schedulers.tornado import TornadoScheduler
def tick():
print('Tick! The time is: %s' % datetime.now())
if __name__ == '__main__':
scheduler = TornadoScheduler()
scheduler.add_job(tick, 'interval', seconds=3)
scheduler.start()
print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))
# Execution will block here until Ctrl+C (Ctrl+Break on Windows) is pressed.
try:
IOLoop.instance().start()
except (KeyboardInterrupt, SystemExit):
scheduler.shutdown()
pass
可以看到很好的跟tornado融合。
参考链接:
http://www.bubuko.com/infodetail-716148.html
http://apscheduler.readthedocs.org/en/latest/