django入门(五) celery使用

免费分享,平时搬砖,周末会录制匹配的视频。
配套视频地址:https://www.bilibili.com/video/BV1eQ4y1U7os/
配套源码 https://github.com/xmccxwj/django-celery

1.业务场景

双11在即,既然是光棍节,就应该品点新茶叶。为所有二级、三级会员推送新茶介绍。

首先这种业务不应该影响主逻辑,也就是后台人员编辑好内容,选择好目标会员后点击就返回提交成功,后台处理中,不是在那里等着后台处理完。

这个实现挺简单,访问后台接口,后台启动一个进程(在java可以起线程,异步),查询二级、三级会员,然后把事先编辑好的内容以邮箱或者短信的形式推送即可。

生产者:生成任务的 消费者:处理任务的

问题:

1.业务发展方面,市场调研发现一次性给用户推送茶叶,内容太多,
客户大多不看,效果不理想,于是计划每天发送一批茶叶即可,
让客户每天都有新鲜感.也挺简单,事先编辑好茶叶的发送日期,
一个定时任务+多进程即可完成
2.业务再次发展,喝茶得用一系列工具。。这些都可以作为商品推送,
也就是每天要发送得任务量越来越大,茶叶,蜡烛,皮鞭等等一系列东西。。
工作人员肯定是上班时间一次性录入,不可能等你后台发完一个在录入一个吧?
比如后台一次性接收到要发送的任务是500个,只能一个一个发,
那么剩下的这些任务得找个地方存呀,
也挺简单,一个queue(消息队列)就搞定了,java/python都简单,
实在后面任务更大500到5000再到5w。。那就用第三方能实现消息队列的
就可以了 比如rabbitmq/redis/mongo等
3.吩咐其它进程做了业务,你想知道结果。也很简单。
如果用的rabbitmq那么可以监听一个队列,
消费者那边做完了把结果发到这个队列,生产者监听这个队列即可。
如果是redis,利用发布订阅,或者blpop即可
4.当整个项目这种业务越来越多,当前服务器就那么大,
都给这种业务了,那些项目最基本的业务都没有地方跑了,
这个也简单可以把做这种任务的单独抽取到一个服务器,
不影响原来的基本业务服务器
5.任务太多了,全部打过去celery扛不住压力,就需要rate-limit限流什么的
其它:中断任务,监控任务,超时机制...........

上面随便针对一个项目中的业务,其实类似的需求很多很多,上续的问题都可以采用这样那样的实现方式,虽然不难也挺麻烦,所以就有了celery,它已经把上续功能基本都实现了,比如已经配置好了如何链接redis/rabbitmq,我们只需要告诉它链接那个redis,也就是地址,也已经写好了定时器,我们只需要告诉他定再什么时间就可以了…

2.celery介绍

celery是python开发,类似上面的场景都可以用celery实现

在这里插入图片描述

上面包含了celery的完整架构图:
1.async task 一般的异步任务 生产者
2.beat:定时异步任务        生产者
3.消息中间件(rabbitmq/redis等) 存储消息,官方建议用rabbitmq
4.监控flower 一个项目会有很多任务用到celery,就不得不监控,方便我们
排查问题,找到性能瓶颈完成调优等
5.worker:执行任务的,也称为消费者,首先主进程接收到任务,
启动子进程去执行任务(也可以通过配置使用eventlet创建协程或者绿色线程等)
6.backend:执行完毕得到结果,方便发送方/消费方获知结果
7.celery可以跟项目一起部署,也可以单独部署到服务器
pis:在整个任务流程中,会生成一个任务id唯一记录当次任务,这个很好理解,
只有通过唯一标识去分辨那么多任务。

如果没有celery,这些功能都需要程序员手动去实现。

没有采用官方听不懂的语言,相信这样介绍,大家应该能明白。

3.celery安装入门

大家记住上面的介绍,就知道在celery中我们需要做什么了。比如celery需要使用消息队列,并且已经整合好,我们至少得告诉它使用哪个消息队列,地址是多少吧。 比如celery已经完成得异步,不需要我们编写,但是我们得告诉它哪个方法需要异步吧,它已经整合好了结果存储,那么我们得告诉它存储的地址吧。

3.1首先创建项目安装celery

其它简单的可以比如redis安装等参考前面的博客

mkvirtualenv -p python3 shuozhongdian    创建虚拟环境 
workon shuozhongdian   进入虚拟环境
pip install django==2.2.1 -i https://pypi.douban.com/simple  安装django后续要整合
pip install redis==3.2.1 -i  https://pypi.douban.com/simple  使用redis做消息队列
pip3 install celery==4.4.2 -i https://pypi.douban.com/simple 安装celery 
pip install eventlet==0.25.1 -i https://pypi.douban.com/simple  安装eventlet 在windows中高版本celery需要
django-admin startproject shuozhongdian 创建项目

使用pycharm打开项目,选择好虚拟环境,创建task.py /test.py

在这里插入图片描述

3.2编写代码

task.py:

from celery import Celery
from celery.task import periodic_task
from celery.schedules import crontab
import time

# 定义一个celery对象
# shuozhongdian_celery 为这个celery改的名字 随便都可以
# broker:表示任务队列的位置
# backend:任务完成后结果存放的位置
# 其它参数 后面详解
app = Celery('shuozhongdian_celery', broker='redis://127.0.0.1:6379/6', backend='redis://127.0.0.1:6379/7')

# 普通任务 由 方法名 send_email.delay()触发
@app.task
def send_email(level, content):
    print('去数据库根据等级查询用户:'+"_".join(level))
    print('发送的内容为:' + content)
    time.sleep(20)
    
  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

说重点丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值