定时任务的应用场景非常广,基本上所有的开发人员都会接触到定时任务,实现定时任务有很多方法,其中Celery里面的定时任务功能就非常强大,并且使用非常简单,只需要安装celery就行,下面就详细介绍celery实现定时任务的步骤.
# 安装celery
pip install celery
一. 搭建celery定时任务架构 在项目中适合的位置新建一个定时任务目录celery_crontab,在目录下创建config.py, main.py, tasks.py三个文件,分别用于编写配置代码,定时任务实现代码,任务函数代码
# 目录结构
- celery_crontab
- config.py
- main.py
- tasks.py
二. 编写代码实现定时任务
1.在config.py中编写配置代码
from celery import Celery
# broker,rabbitmq
app = Celery('celery_crontab', broker='amqp://guest@localhost//')
# app = Celery('demo', broker='redis://127.0.0.1:6379/15')
2.在tasks.py中编写任务函数代码
from config import app
@app.task
def crontab_func1():
print('在此编写任务要实现的代码')
@app.task
def crontab_func2():
print('在此调用实现了定时任务功能的函数或方法')
3.在main.py中调用任务,并实现定时任务功能
from celery.schedules import crontab
from tasks import *
# 设置定时任务
app.conf.beat_schedule = {
# 设置定时任务的参数,key可以自定义,见名知义,
# value为定时任务的相关参数的字典
'contab_func1-every-1-minute': {
# 指定要执行的任务函数
'task': 'tasks.crontab_func1',
# 设置定时启动的频率,没分钟执行一次任务函数
'schedule': crontab(minute='*/1'),
# 传入任务函数的参数,可以是一个列表或元组,
# 如果函数没参数则为空列表或空元组
'args': []
},
'contab_func2-every-day': {
'task': 'tasks.crontab_func2',
# 每周一至周五早上8点执行任务函数
'schedule': crontab(minute=0, hour=8,
day_of_week=[1, 2, 3, 4, 5]),
'args': []
},
}
# 实现定时任务的另一种方式
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
# sender.add_periodic_task(间隔时间秒,
# 任务名.s(参数), name='自定义任务名')
sender.add_periodic_task(10.0, crontab_func1.s(),
name='crontab_func1 every 10')
sender.add_periodic_task(
# 每分钟执行一次
crontab(minute='*/1'),
# .s()内传入任务函数需要的参数
crontab_func2.s()
)
在celery文档中例举了更多任务频率的设置方式,可以直接阅读文档 Celery documentation:
http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html
也可以按住Ctrl左键点击代码中的crontab,进入源码看__doc__(文档注释)内容,里面也例举了很多任务频率的设置方法
三. 启动定时任务 启动定时任务应在main.py的位置,所以最好到main.py所在目录下执行命令,在其他位置启动时要指定main的路径
'''
使用multi方式启动定时任务,celery会自动生成任务子节点和自动创建子进程
work为执行任务的进程名字
-A main 指定定时任务的启动函数main
-l info 指定日志等级为info
-B 将celery定时任务设置为后台守护进程,不占用终端
--logfile=celerylog.log 指定日志保存的文件名.也可指定路径加文件名
'''
celery multi start work -A main -l info -B --logfile=celerylog.log
# 停止定时任务时,将start换成stop
celery multi stop work -A main -l info -B --logfile=celerylog.log
# 重启定时任务,将start换成restart
celery multi restart work -A main -l info -B --logfile=celerylog.log
Celery的使用场景中,不管是实现异步任务,还是实现定时任务,基本都会依赖命令来启动和停止任务,所以Celery的命令是非常多的,了解更多celery的命令可以到文档里查看. Celery documentation:
http://docs.celeryproject.org/en/latest/reference/celery.bin.celery.html
也可以在终端输入 celery -h 查看帮助信息. Windows Bug:RuntimeError: This platform does not support detach. site-packages\celery\platforms.py中尝试导入模块 “resource”时失败,这个模块不支持Windows,所以定时任务应该部署在Linux系统上.