python定时任务模块apscheduler
2018-07-18 本文已影响3人
陆_志东
apscheduler 官方文档
定时任务也可以将处理的结果存到数据库,数据库配置请到官方文档 jobstore里查看用法
apscheduler是python的定时任务框架,下面就是讲解定时任务的使用
apscheduler的安装
pip install apscheduler
apscheduler 模块的三种触发器模式:
- cron 定时任务触发器
- interval 循环任务触发器
- date 一次性任务触发器
下面是程序示例
import datetime
import logging
from apscheduler.schedulers.blocking import BlockingScheduler
import time
def print_time(x):
time1 = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
print(time1,"模式:{}".format(x))
def clear_job(job_id):
scheduler.remove_job(job_id)
print("{}任务被删除了".format(job_id))
# 创建管理器,实例化一个对象 ,
scheduler = BlockingScheduler()
# 如果想要给定时任务模块添加日志,有两种方式
#方式一:
logging.basicConfig(level=logging.INFO, # 配置logging配置
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename='log1.txt', # 指定日志打印到的文件
filemode='a') # 文件的打开方式
scheduler._logger = logging
# 方式二: 是创建一个logger 对象,在程序里面打印日志,使用nohup的方式后台运行程序,
# 然后将程序标准输出和错误输出重定向一个文件里面
# 下面每个任务都添加一个id,方便移除任务,当你想要移除一个任务的时候使用scheduler.remove_job(id) 就可以了
# scheduler.add_job(func=print_time,args=("定时任务",),trigger="cron",day_of_week='0-6', hour=9, minute=5)
# 每天的9点5分执行
scheduler.add_job(func=print_time,args=("定时任务",),trigger="cron",second="*/5" , id="dingshi_1")
# 每5秒执行一次,如果写的second=5,意思是每分钟的第5秒执行
scheduler.add_job(func=print_time,args=("循环任务",),trigger="interval",seconds=3,id="xunhuan_1")
# 每3秒执行一次循环的任务
scheduler.add_job(func=clear_job,args=("xunhuan_1",),trigger="date",next_run_time="2018-07-18 16:56:30")
# 一次性任务需要next_run_time参数指定下次运行的时间
# 这里使用一次性任务删除另外一个循环任务,在现实场景中,可以设定当运行任务到什么程度时,删除其他的任务(remove_job)
scheduler.start() # start开始定时任务
下面是协程版的定时任务
from datetime import datetime
import os
from apscheduler.schedulers.gevent import GeventScheduler
def tick():
print('Tick! The time is: %s' % datetime.now())
if __name__ == '__main__':
scheduler = GeventScheduler()
scheduler.add_job(tick, 'interval', seconds=3)
g = scheduler.start() # g is the greenlet that runs the scheduler loop
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:
print("没有阻塞111")
g.join() # 底层调用的gevent模块,需要安装gevent包,这里调用的join也是协程的join
# 这里join会阻止程序运行,但如果不join协程会因为线程结束而结束,所以在join之前执行想执行的代码,或者多线程多协程处理
print("阻塞了222")
except (KeyboardInterrupt, SystemExit):
pass