在实际的开发过程中经常会出现一些耗时操作,或者一些定时操作,比如定时短信、邮件、定时清理等等… 所以使用celery是一个很好的选择。
celery是用来处理大量信息的分布式系统,同时提供了操作和维护分布式系统做需要的分布式工具,简单来说,celery就是一个管理分布式队列的工具。
celery本身不是任务队列,知识一个分布式管理工具,内部封装了各种的队列操作,使用celery可以更方便快捷的管理任务队列。
celery == 3.1.25
redis == 2.10.0
一、创建一个tasks.py文件,
import time
from celery import Celery
backend = 'redis://localhost:6379/0'
broker = 'redis://localhost:6379/0'
# 创建celery对象
app = Celery('task_add', backend=backend, broker=broker)
# 创建celery任务
@app.task(name='number_add')
def number_add(x, y):
time.sleep(4)
print('number_add 进来了...')
return x + y
二、创建test.py文件用来执行celery任务
# 我的tasks.py test.py文件都是在celery_task文件夹中
from celery_task.tasks import number_add
# 调用方法
if __name__ == '__main__':
print('start task...')
# 调用delay方法开启任务
result = number_add.delay(3, 5)
print('end task...')
# 拿到任务结果
num = result.get()
print(num)
三、开启celery,等待任务执行
# -A 后面指定任务就是tasks.py,后面的路径--workdir ./celery_task,根据自己的文件修改,执行的命令在同一文件下可以不要
celery worker -A tasks -l INFO --workdir ./celery_task
看到这个界面说明celery执行成功。
四、执行任务,
执行test.py里面的代码,可以看到输出结果。
首先看一下目录结构:
一、__init __.py初始化文件
from celery import Celery
# 任务名称demo
app = Celery('demo')
# 通过celery实例加载配置模块,配置信息在celeryconfig.py文件中
app.config_from_object('celery_task.celeryconfig')
二、celeryconfig.py配置文件
BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
# 时区
CELERY_TIMEZONE = 'Asia/Shanghai'
# 导入指定的任务模块
CELERY_IMPORTS = (
'celery_task.tasks'
)
三、tasks.py任务管理,
和上面的task.py文件内容一致,这里app是导入的不是创建的
# 模块化之后
from celery_task import app
@app.task
def number_add(x, y):
time.sleep(4)
print('number_add 进来了...')
return x + y
四、tast.py文件,用来执行任务
# 模块化之后
from celery_task import tasks
# 调用方法
if __name__ == '__main__':
print('start task...')
result = tasks.number_add.delay(3, 5)
print('end task...')
num = result.get()
print(num)
五、celery启动命令
这里与上面的命令不一样
# celery_task:是celery_task.py文件,
# 这里没有指定路径,因为命令是在celery_task.py文件父目录下执行的,所以不用指定。
celery worker -A celery_task -l INFO
六、运行test.py文件代码
将上面的配置文件celeryconfig.py中增加如下代码:
# celeryconfig.py
# 定时任务
CELERYBEAT_SCHEDULE = {
# 任务一,每10秒指定一次
'task_1': {
# 指定任务
'task': 'celery_task.tasks.number_add',
# 每十秒执行一次
'schedule': timedelta(seconds=10),
# 参数
'args': (3, 6)
},
# 任务二,定时执行,每天固定时间执行
'task_2': {
# 指定任务
'task': 'celery_task.tasks.number_mult',
# 每天执行
'schedule': crontab(hour=18,minute=31),
# 参数
'args': (3, 6)
}
}
还要在tasks.py中增加一个任务方法:
# tasks.py
@app.task
def number_mult(x, y):
print('定时-乘法')
return x * y
这里提醒一下celery==4.10版本的每天的定时任务可能有bug,请使用其他版本。
执行celery启动命令:
两条命令
celery worker -A celery_task -l INFO
# celery beat是用来开启定时任务调度的
celery beat -A celery_task -l INFO
详细的定时任务代码请看:Python异步任务celery,celery定时任务,定时发送邮件、短信、执行清理等等
参考资料:
celery-分布式队列管理工具
官方文档
celery视频