celery异步任务队列

基本概念:

Celery 有三个角色:

任务的发出者: 发出所有执行的任务(任务就是函数)
任务队列: ( 存放所要执行的任务信息)
处理者: 也就是工作的进程或协程, 负责监听任务队列, 发现任务便执行对应的任务函数

特点:

任务发送者和处理者可以分布在不同的电脑上, 通过中间人进行信息的交换.
任务队列中的任务会进行排序, 先添加的任务会被先执行.

图示:

yarn list 查看任务占用的资源_yarn list 查看任务占用的资源

安装

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( ) 来调用