python 执行定时任务的方式
在开发项目中,我们有时会遇到需要定时去执行一些任务的需求,如每周的周六去执行一下linux系统的监控程序,查看server的负载情况, 或者每隔一段时间检查设备状态以便在设备状态出错的情况时及时的告知用户等。
目前主要的 python执行定时任务主要有一下几种:
(1)循环sleep
(2)threading的Timer
(3)schedule模块
(4)APScheduler定时框架
(5)crontab Linux的定时任务(Crontab):
python定时任务的具体实现
(1) 循环sleep实现
from datetime import datetime
import time
'''
每个 10 秒执行要执行的任务。
'''
def timedTask():
while True:
要执行的任务dothing()
time.sleep(10)
if __name__ == '__main__':
timedTask()
(2)threading的Timer实现定时任务
首先需要引入Timer的包
导入:from threading import Timer
其参数及方法如下
Timer方法 | 说明 |
---|---|
Timer(interval, function, args=None, kwargs=None) | 创建定时器 |
cancel() | 取消定时器 |
start() | 使用线程方式执行 |
join(self, timeout=None) | 等待线程执行结束 |
例子
10秒后执行
def printHello():
print("start" )
Timer(5, printHello).start()
每隔十秒执行一次
def printHello():
print("start" )
timer = threading.Timer(10,printHello)
timer.start()
if __name__ == "__main__":
printHello()
(3)调度模块:schedule
schedule是一个第三方轻量级的任务调度模块,可以按照秒,分,小时,日期或者自定义事件执行时间;
需要先安装schedule
pip install schedule
示例如下
import schedule
import time
def job():
print("I'm working...")
schedule.every(10).seconds.do(job) # 每10秒执行一次
schedule.every(10).minutes.do(job) # 每10分钟执行一次
schedule.every().hour.do(job) # 每小时执行一次
schedule.every().day.at("10:30").do(job) # 每天十点半执行
schedule.every(5).to(10).minutes.do(job) # 不理解
schedule.every().monday.do(job) # 每周一执行
schedule.every().wednesday.at("13:15").do(job) # 每周三13点15执行
schedule.every().minute.at(":17").do(job) # 不理解
while True:
schedule.run_pending() # 运行所有可运行的任务
time.sleep(1)
(4)APScheduler定时框架
APScheduler是基于Quartz的一个Python定时任务框架。提供了基于日期、固定时间间隔以及crontab类型的任务,并且可以持久化任务。
需要先安装apscheduler库,cmd窗口命令:pip install apscheduler
组件具体说明:
1)triggers(触发器):触发器包含调度逻辑,每一个作业有它自己的触发器
2)job stores(作业存储):用来存储被调度的作业,默认的作业存储器是简单地把作业任务保存在内存中,支持存储到MongoDB,Redis数据库中
3)executors(执行器):执行器用来执行定时任务,只是将需要执行的任务放在新的线程或者线程池中运行
4)schedulers(调度器):调度器是将其它部分联系在一起,对使用者提供接口,进行任务添加,设置,删除。
简单的间隔时间调度代码:
from pymongo import MongoClient
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.jobstores.mongodb import MongoDBJobStore
from apscheduler.jobstores.memory import MemoryJobStore
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
def my_job():
print 'hello world'
host = '127.0.0.1'
port = 27017
client = MongoClient(host, port)
jobstores = {
'mongo': MongoDBJobStore(collection='job', database='test', client=client),
'default': MemoryJobStore()
}
executors = {
'default': ThreadPoolExecutor(10),
'processpool': ProcessPoolExecutor(3)
}
job_defaults = {
'coalesce': False,
'max_instances': 3
}
scheduler = BlockingScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults)
scheduler.add_job(my_job, 'interval', seconds=5)
try:
scheduler.start()
except SystemExit:
client.close()
(5)通过Crontab定时执行python脚本
在Linux下可以很方便的借助Crontab来设置和运行定时任务。进入Crontab文件编辑页面,设置时间间隔,使用一些shell命令来运行bash脚本或者是Python脚本,保存后Linux会自动按照设定的时间来定时运行程序。