八、DRF之celery 配置

DRF 之 celery 异步处理问题

发送邮件, 短信, 文件上传

1. 简介 celery -> 生产者 消费者 模型 的一种体现

client(生成任务) -> broker(任务存储队列) -> worker(执行任务)

2. 安装三步走:

  • tasks ------> 任务
  • broker ----> 消息队列(中间人)
  • worker----> 执行者

3. 在 工程中 创建 celery_tasks 包 (存放celery所有的文件)


创建任务的一些前提条件:
  • 任务 就是 函数
  • 任务 需要被celery 实例出的对象task 方法 装饰
  • 任务 需要被celery 实例出的对象 自动检测

help!: => We need a celery 实例对象 哎!!!**

4. 所以这里需要先 创建出<celery对象>
  • 在celery_tasks包 下 , 新建程序执行入口模块 -> main.py
# celery_tasks/main.py

###################### 需先导入工程配置文件  #######################
#  作用: 比如 获取 Django项目的 redis 配置?!
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
    # 设置 添加 Django项目 的 setting 路径 到 os 环境变量
    os.environ['DJANGO_SETTINGS_MODULE'] = 'mall.settings'  # 要对应 自己的 Django 项目名
    
######################## 创建celery实例 ##########################
# main 其实 就是 给celery设置一个名字, 这个名字唯一 就可以
# 推荐使用 文件路径
from celery import Celery
app = Celery(main='celery_tasks')

############ 加载 config.py 配置文件(设置broker任务队列) ############
# 配置见下文
app.config_from_object('celery_tasks.config')

################## 实现 celery实例对象 自动检测任务 #################
# 参数: 列表
# 列表中 需要填写任务的包路径
app.autodiscover_tasks([celery_tasks.sms])

# end
  • 上面的 main.py 中引入了一个 config配置文件
  • 所以我们在这里 创建一个 config.py文件

好了, 暂停一下, 现在让我们先了解 两个概念:

broker: 是一个消息传输的中间件,可以理解为一个邮箱。每当应用程序调用celery的异步任务的时候,会向broker传递消息,而后celery的worker将会取到消息,进行对于的程序执行。好吧,这个邮箱可以看成是一个消息队列。

backend: 通常程序发送的消息,发完就完了,可能都不知道对方时候接受了。为此,celery实现了一个backend,用于存储这些消息以及celery执行的一些消息和结果。对于 brokers,官方推荐是rabbitmq和redis,至于backend,就是数据库啦。为了简单起见,我们都用redis。

5. 接上文, 配置 config.py ---> 即: <broker配置>
  • config.py 配置文件 (设置broker任务队列相关)
# celery_tasks/config.py
# 配置一个 config.py, 存储配置信息, 实现 配置信息 存在于 单独的配置文件中
# 之后在main.py, 让实例对象 app 加载其中的配置

broker_url = 'redis://127.0.0.1/14'         # 配置 borker  存储在 redis:14号 库
result_backend = 'redis://127.0.0.1/15'     # 配置 backend 存储在 redis:15号 库
6. 创建 <任务>, 并用 上面的 celery 对象的task方法 装饰
  1. 在celery_tasks文件夹下, 新建 sms 包

  2. 在sms 包 下, 新建 tasks.py 模块

任务注意:

  • 任务包下 所对应的py文件名, 必须为 tasks.py
  • 所谓的 任务 其实 就是 函数
  • 这个 函数 需要被 cekery 的实例对象的task装饰器 装饰
  • 这个任务 需要 被celery实例对象 自动检测(已经在 main.py 中实现)
# celery_tasks/sms/tasks.py
from libs.yuntongxun.sms import CCP
#####################
# @app.task 需要 加 括号么???
#####################
#可以设置name参数
@app.task(name='send_sms_code')     # 调用 app实例对象的task方法, 装饰这个 函数任务
def send_sms_code(mobile, sms_code):
    # 发送手机号为: mobile,  发送数据为: sms_code, 有效期:5, 使用模板:1
    CCP().send_templates_sms(mobile, [sms_code, 5], 1)
7. 在视图函数中 调用 task任务
# ...
from celery_tasks.sms.tasks import send_sms_code
# dalay 的参数 同 send_sms_code的参数
send_sms_code.delay(mobile, sms_code)
# ...
8. woker
# celery -A celery 实例对象所在的文件 worker -l info
celery -A celery_tasks.main worker -l info

划重点, 易错 总结:

1. 装饰器的写法错误:
@app.task
装饰器的写法错误
2. 调用方法 错误: delay - 延期
send_sms_code.delay(mobile, sms_code)
调用方法 错误_delay
3. config.py 配置文件 调用
app.config_from_object("celery_tasks.config")

# 为什么也可以这样写 ???!!!
from celery_tasks import config
app.config_from_object(config)
config.py 配置文件
4. redis-存储队列:

前提: 这是在 没有 woker 的情况下 积攒的 队列任务

  • 存入的 元素 "celery", 是一个redis的 list 数据
  • 新任务是从左侧 插入的
  • 提取时候 需要用 命令:
    lrange "celery" 0 -1
127.0.0.1:6379[14]> keys *
1) "_kombu.binding.celery"
2) "celery"
127.0.0.1:6379[14]> type "celery"
list
127.0.0.1:6379[14]> lrange "celery" 0 -1
1) "{\"body\": \"W1siMTcxOTEwOTA4OTYiLCAiNjk4ODU5Il0sIHt9LCB7ImNhbGxiYWNrcyI6IG51bGwsICJlcnJiYWNrcyI6IG51bGwsICJjaGFpbiI6IG51bGwsICJjaG9yZCI6IG51bGx9XQ==\", \"content-encoding\": \"utf-8\", \"content-type\": \"application/json\", \"headers\": {\"lang\": \"py\", \"task\": \"celery_tasks.sms.tasks.send_sms_code\", \"id\": \"669ed6ce-b894-4fbb-bf22-074843305865\", \"eta\": null, \"expires\": null, \"group\": null, \"retries\": 0, \"timelimit\": [null, null], \"root_id\": \"669ed6ce-b894-4fbb-bf22-074843305865\", \"parent_id\": null, \"argsrepr\": \"('171xxxxx896', '698859')\", \"kwargsrepr\": \"{}\", \"origin\": \"gen1786@Dabenstone\"}, \"properties\": {\"correlation_id\": \"669ed6ce-b894-4fbb-bf22-074843305865\", \"reply_to\": \"de91a2aa-0236-3ca2-9e34-28af36442b00\", \"delivery_mode\": 2, \"delivery_info\": {\"exchange\": \"\", \"routing_key\": \"celery\"}, \"priority\": 0, \"body_encoding\": \"base64\", \"delivery_tag\": \"7fae1b62-61d8-4462-88c2-7662a7e293dd\"}}"
2) "{\"body\": \"W1siMTcxOTEwOTA4OTIiLCAiMDMzMzM3Il0sIHt9LCB7ImNhbGxiYWNrcyI6IG51bGwsICJlcnJiYWNrcyI6IG51bGwsICJjaGFpbiI6IG51bGwsICJjaG9yZCI6IG51bGx9XQ==\", \"content-encoding\": \"utf-8\", \"content-type\": \"application/json\", \"headers\": {\"lang\": \"py\", \"task\": \"celery_tasks.sms.tasks.send_sms_code\", \"id\": \"dea15283-18a4-4275-82c4-106175ce56a3\", \"eta\": null, \"expires\": null, \"group\": null, \"retries\": 0, \"timelimit\": [null, null], \"root_id\": \"dea15283-18a4-4275-82c4-106175ce56a3\", \"parent_id\": null, \"argsrepr\": \"('171xxxxx892', '033337')\", \"kwargsrepr\": \"{}\", \"origin\": \"gen1776@Dabenstone\"}, \"properties\": {\"correlation_id\": \"dea15283-18a4-4275-82c4-106175ce56a3\", \"reply_to\": \"653a7b98-6fd1-3d12-9048-c840c894773c\", \"delivery_mode\": 2, \"delivery_info\": {\"exchange\": \"\", \"routing_key\": \"celery\"}, \"priority\": 0, \"body_encoding\": \"base64\", \"delivery_tag\": \"e3773ab2-94a1-4257-a110-54dd418f5b20\"}}"
127.0.0.1:6379[14]>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • Celery 在程序的运行过程中,我们经常会碰到一些耗时耗资源的操作,为了避免它们阻塞主程序的运行,我们经常会采用...
    HAO延WEI阅读 3,430评论 1 5
  • 在学习Celery之前,我先简单的去了解了一下什么是生产者消费者模式。 生产者消费者模式 在实际的软件开发过程中,...
    c2db9ba35639阅读 3,517评论 0 8
  • 1.定义: Celery是一个异步的任务队列(也叫做分布式任务队列) 2.工作结构 Celery分为3个部...
    四号公园_2016阅读 28,701评论 5 60
  • Celery 在程序运行过程中,经常会遇到一些耗时耗资源的任务,为了避免这些任务阻塞主进程的运行,我们会采用多线程...
    玩阿轲睡妲己阅读 8,731评论 1 9
  • 与不喜欢的人在一起,不要硬凑。缘分尽了就是尽了。南无阿弥陀佛。 不喜欢一些人,是真的不喜欢。随缘
    如幻一生阅读 679评论 0 0