上次有个需求是数据库每天定时清理,最后使用了mysql自带的事件调度+存储过程完成了这个事情,详见(点击查看),但是事后仔细回味感觉这很不python,所以决定使用异步列队神器Celery来完成这个事情。
首先需要用到redis来做缓存,所以首先需要保证电脑上有redis环境,安装教程参见我之前的redis教程(点击查看)
这里假设已经安装好redis服务了,接下来就是安装python的依赖包:
pip install celery
pip install redis
pip install pymysql
由于我们要对mysql进行操作,所以需要借助pymysql操作数据库。
我们按照官方文档指出的,下面这种方式对定时任务进行设置:
# test.py
from celery import Celery
from celery.schedules import crontab
import pymysql, datetime
app = Celery()
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
# 每天0点0分运行
sender.add_periodic_task(
crontab(minute=0, hour=0),
del_data(),
)
@app.task
def del_data():
# 连接数据库(host,user,password,database)
db = pymysql.connect("localhost", "user", "password", "database")
# 使用cursor()方法创建一个游标对象
cursor = db.cursor()
# 使用execute()方法执行SQL语句
cursor.execute(
"DELETE FROM UserInfo WHERE \
(TO_DAYS(NOW( ))-TO_DAYS(create_time)) >= `date_inter`"
)
# 关闭游标和数据库的连接
cursor.close()
db.close()
print(datetime.datetime.now(), '数据已更新')
Celery 提供了一个 crontab 的对象,功能和linux中的crontab基本一致,可以对于定时任务进行更为精确的时间设置,而不仅限于多少秒重复一次这种简单的任务。下面用例子的方式来说明一下。
from celery.schedules import crontab
# 每分钟执行一次
c1 = crontab()
# 每天凌晨十二点执行
c2 = crontab(minute=0, hour=0)
# 每十五分钟执行一次
crontab(minute='*/15')
# 每周日的每一分钟执行一次
crontab(minute='*',hour='*', day_of_week='sun')
# 每周三,五的三点,七点和二十二点没十分钟执行一次
crontab(minute='*/10',hour='3,17,22', day_of_week='thu,fri')
上面都是配置,接下来就是如何去运行该程序了。
首先到redis的文件下,后台启动redis服务
然后启动一个组件 beat,它用于对任务进行调度,使用我们的test.py文件为例:
celery -A test beat
# 这个命令会启动 test 应用的 beat。
我们也可以在启动 worker 的时候使用 -B 参数同时启动 beat 。
celery -A test worker -l info -B
这样就用Python+celery+redis实现了一个定时任务,是不是比用mysql的事件调度简单得多。