腾讯蓝鲸框架下Celery的使用

腾讯蓝鲸框架下Celery的使用

Celery是一个异步任务队列/基于分布式消息传递的作业队列,它支持很多任务类型,例如后台任务,定时任务,周期性任务等

一、Celery的工作结构

在这里插入图片描述

用户将消息推送给broker,broker将任务存入队列,此时worker一直监听任务队列,如果有,则获取并且去执行,然后将执行结果存储到store。如果worker没有开启或者处理不过来时,borker会出现消息队列堵塞的情况。

简单的理解:毕业季到了,一些公司会给老师一些offer名额,而这个老师就是broker。学生就是worker,我们想要offer就得去老师那里获取。然后worker把面试结果返回给store。

二、任务1

假如我们有一个业务,当用户登录我们系统之后,发现该用户的ip不在常用的地点时,就发送一个邮件给email进行确认。

假设我们的业务逻辑代码如下:

# tasks.py
import time

def check_ip(ip):
    ip_list = [1, 2, 3, 4, 5, 6]  # 常用ip地址
    if ip in ip_list:
        return "欢迎登录"
    else:
        # 模仿后台调用email接口去向用户发送数据
        time.sleep(10)
        return "由于您在不常用地点登录,请在邮箱进行确认后再次登录"

我们使用python manage.py shell进入编辑界面

在这里插入图片描述

会发现,如果输入的数字在ip_list内的话,马上就会返回一个结果,但不在里面的话,就会等待10s。但是设想以下,如果有100个人来访问服务器,每个人都在不同的地方进行登录的话,后端就会被阻塞。这将严重影响用户体验。

因为邮箱、验证码等都是一些时效性不那么严谨的东西。那我们是否可以这样:当用户登录之后,直接返回一个结果,将处理事件放到另一个后台进行处理,这样就能保证主服务器的正常运行,同时也能让邮箱等正常的发送给用户。这里就需要用到celery。

三、任务1-1

要用到celery我们就需要下载,这里可以直接使用pip进行下载。然后当下载完之后,在后台进行简单的配置。我们就可以来完成一个简单的异步任务了。

import time

from celery.task import task

@task()
def check_ip(ip):
    ip_list = [1, 2, 3, 4, 5, 6]
    if ip in ip_list:
        return "欢迎登录"
    else:
        # 模仿后台调用email接口去向用户发送数据
        time.sleep(10)
        return "由于您在不常用地点登录,请在邮箱进行确认后再次登录"

代码配置好之后,就需要将该文件在后台进行注册:

# CELERY 开关,使用时请改为 True,修改项目目录下的 Procfile 文件,添加以下两行命令:
# worker: python manage.py celery worker -l info
# beat: python manage.py celery beat -l info
# 不使用时,请修改为 False,并删除项目目录下的 Procfile 文件中 celery 配置
IS_USE_CELERY = True

# CELERY 并发数,默认为 2,可以通过环境变量或者 Procfile 设置
CELERYD_CONCURRENC
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值