celery异步任务队列
基本概念:
Celery 有三个角色:
任务的发出者: 发出所有执行的任务(任务就是函数)
任务队列: ( 存放所要执行的任务信息)
处理者: 也就是工作的进程或协程, 负责监听任务队列, 发现任务便执行对应的任务函数
特点:
任务发送者和处理者可以分布在不同的电脑上, 通过中间人进行信息的交换.
任务队列中的任务会进行排序, 先添加的任务会被先执行.
图示:
安装
pip install celery
使用:
创建 celery 对象并配置中间人地址
# 引入
from celery import Celery
# 创建celery对象,
# 参数一: 随意起的名称 例如这里的demo
celery_app = Celery('demo')
配置:
配置文件: broker_url = '中间人的地址'
celery_app.config_from_object('配置文件路径')
定义任务函数:
任务函数, 就是我们需要执行的函数:
# 我们这里需要使用上面定义好的对象, 装饰任务
# 这里有个参数: name='当前任务的名称' 这里当前任务的名称可以随便起
@celery_app.task(name='my_task')
def my_task(a, b):
print('任务函数被执行')
...
启动worker, 进行监听:
celery -A 'celery_app文件路径' worker -l info
"""
celery: 只要我们装完这个包,就有这个命令
-A: -A指定了后面的celery_app文件的路径.
worker: 代表启动了工作
-l : 一旦工作起来就会启动日志, 使用这个参数指定日志的级别
info: 日志级别
"""
发出任务
# 注意: 任务一定要调用 delay() 函数
my_task.delay(2, ,3)
Django celery 实例演示
在Django项目中创建一个包(celery_ts)(名字随意),在包中添加两个文件
main.py
# 导入
from celery import Celery
# 为celery使用django配置文件进行设置
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
os.environ['DJANGO_SETTINGS_MODULE'] = 'meiduo_mall.settings.dev'
# 创建celery对象
# 名字随便起的: celery_task
celery_app = Celery('celery_task')
# 将config.py中添加的配置信息, 加载配置到这里:
celery_app.config_from_object('celery_ts.config')
# 自动发现任务:
# 在自动发现任务的时候, sms里面的任务名字必须是: tasks
# 这是固定死的
celery_app.autodiscover_tasks(['celery_ts.sms'])
config.py
# 设置中间人broker地址:
# 我们把信息保存在redis服务器的第三个存储空间中:
broker_url = 'redis://127.0.0.1:6379/3'
新建一个任务包(sms)(名字随意),
里面添加一个 tasks.py 文件, 注意: 这个文件的名字必须是 tasks,任务函数必须在tasks.py文件中)
# 导入上面创建的 celery_app 对象
from celery_ts.main import celery_app
# 封装任务函数:
@celery_app.task(name='send_sms_code')
def send_sms_code(a, b):
print('任务函数被调用... a : %s, b : %s' % (a,b))
启动当前程序:
我们这里创建的是一个执行者:
我们可以在安装有 redis 和 celery 的虚拟环境下, 敲如下命令:
celery -A celery_ts.main worker -l info
发送任务
我们可以开启交互模式来执行
>>> from celery_ts.sms.tasks.import send_sms_code
>>> send_sms_code.delay(2,3)
注意:
这里特别要注意一点: 调用任务( tasks )的时候, 我们需要用 任务名.delay( ) 来调用