36.如何使用定时任务
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> 在app后台开发中,经常需要执行一些定时任务,例如,定期清理一下项目产生的垃圾文件啊,或者要某段时间,执行一些业务逻辑等等,都需要使用到定时任务。下面介绍一下常见的linux的定时任务和用开发语言实现的定时任务。</span>
1. Linux定时任务Crontab
使用Crontab –e ,就能创建定时任务。定时任务会写入到/var/spool/cron/中,注意啊,是写入到用户的那个文件中,例如,用户jeff的定时任务会写入到/var/spool/cron/jeff。千万不能使用vi直接编辑这个文件,因为直接在编辑的过程中,可能会出现语法错误,使用crontab编辑是能检测出语法错误的。
Crontab的命令语法如下:
crontab [-u username] [-l|-e|-r]
参数:
-u :只有 root 才能进行这个任务,编辑其他用户的crontab
-e :编辑 crontab 的工作内容
-l :查阅 crontab 的工作内容
-r :移除所有的 crontab 的工作内容。
Crontab的命令格式如下
代表意义 |
分钟 |
小时 |
日期 |
月 |
周 |
命令 |
范围 |
0-59 |
0-23 |
1-31 |
1-12 |
0-7 |
命令 |
例子
特殊的符号 |
含义 |
* |
任何时刻都接受,例如:* * * * * cmd 表示每分钟都运行cmd |
, |
表示有多个时间段,例如:2,4 * * * * cmd 表示第2,第4分钟都运行cmd |
- |
表示时间间隔,例如:2-4 * * * * cmd 表示第2至第4分钟每分钟都运行cmd |
/n |
表示隔n个时间单位,例如*/5 * * * * cmd 表示每隔5分钟运行cmd |
按照官方的文档,运行定时任务的最少单位是分钟,如果需要运行秒级的定时任务,应该怎么办呢?
一个取巧的方法如下:
* * * * * cmd
* * * * * sleep 20; cmd
* * * * * sleep 40; cmd
上面就是每20秒运行一次cmd的crontab的做法。
2. 在后台轻松管理各种各样的定时任务
在项目初期,需要运行的定时任务比较少,用linux crontab管理定时任务还没太大问题,随着项目的不断推进,慢慢发现了crontab的不足:
l 当需要执行的定时任务有上百个的时候,crontab的管理形式太落后了。
l 需要执行秒级的定时任务时很不方便
l 没有一个统一的后台查看各个定时任务的状态,例如,哪些定时任务执行成功了,哪些定时任务执行过程中有异常,异常信息有什么灯
因此,针对上面的问题,后台需要引入新的定时任务框架,java下的Quartz 或者python下的APScheduler。
Quartz是OpenSymphony开源组织的一个开源开源作业调度框架,它可以与J2EE与J2SE应用程序相结合也可以单独使用。
APScheduler是基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便。
APScheduler实现了以下的功能:
l 通过RAM,mysql,mongodb,文件,持久化存储定时任务。
l 支持秒级的定时任务。
l 支持基于日期、固定时间间隔以及crontab类型的定时任务。
(1)APScheduler的安装
使用easy_install安装:
easy_install apscheduler
或者下载源码后安装:
python setup.py install
(2)一个创建定时任务的例子,演示了每3秒运行一次定时任务
from datetime import datetime import time from apscheduler.scheduler import Scheduler def tick(): print('Tick! The time is: %s' % datetime.now()) if __name__ == '__main__': scheduler = Scheduler() scheduler.add_interval_job(tick, seconds=3) print('Press Ctrl+C to exit') scheduler.start() # This is here to simulate application activity (which keeps the main # thread alive). while True: print('This is the main thread.') time.sleep(2)
更详细的APScheduler的用法,请参考APScheduler的文档。
--------------------------------------------------------------
打开链接 app后端系列文章总目录 总目录 ,能查看本人发表过的所有原创“app后端”文章。
【作者】曾健生
【QQ】190678908
【app后端qq群】254659220
【微信公众号】 appbackend
【新浪微博】 @newjueqi
【博客】http://blog.csdn.net/newjueqi
如果您觉得文章对你有所帮助,欢迎打赏。
微信打赏:
支付宝打赏:
版权声明:本文为博主原创文章,未经博主允许不得转载。