我用Celery做了一个异步任务

14 篇文章 1 订阅
1 篇文章 0 订阅

Celery简介

  celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度。它的执行单元为任务(task),利用多线程,如Eventletgevent等,它们能被并发地执行在单个或多个职程服务器(worker servers)上。任务能异步执行(后台运行)或同步执行(等待任务完成)

  在生产系统中,celery能够一天处理上百万的任务。它的完整架构图如下:

在这里插入图片描述

组件介绍

  • Producer:调用了Celery提供的API、函数或者装饰器而产生任务并交给任务队列处理的都是任务生产者。
  • Celery Beat:任务调度器,Beat进程会读取配置文件的内容,周期性地将配置中到期需要执行的任务发送给任务队列。
  • Broker:消息代理,又称消息中间件,接受任务生产者发送过来的任务消息,存进队列再按序分发给任务消费方(通常是消息队列或者数据库)。Celery目前支持RabbitMQ、Redis、MongoDB、Beanstalk、SQLAlchemy、Zookeeper等作为消息代理,但适用于生产环境的只有RabbitMQ和Redis, 官方推荐 RabbitMQ。
  • Celery Worker:执行任务的消费者,通常会在多台服务器运行多个消费者来提高执行效率。
  • Result Backend:任务处理完后保存状态信息和结果,以供查询。Celery默认已支持Redis、RabbitMQ、MongoDB、Django ORM、SQLAlchemy等方式。

celery应用举例

  • Celery是一个基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理,如果你的业务场景中需要用到异步任务,就可以考虑使用celery
  • 你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情
  • Celery 在执行任务时需要通过一个消息中间件来接收和发送任务消息,以及存储任务结果, 一般使用rabbitMQ or Redis

Celery有以下优点

  • 简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的
  • 高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务
  • 快速:一个单进程的celery每分钟可处理上百万个任务
  • 灵活: 几乎celery的各个组件都可以被扩展及自定制

Celery特性

  • 方便查看定时任务的执行情况, 如 是否成功, 当前状态, 执行任务花费的时间等.
  • 可选 多进程, Eventlet 和 Gevent 三种模型并发执行.
  • Celery 是语言无关的.它提供了python 等常见语言的接口支持.

写一个简单的案例(从配置到演示)

Celery配置

1、安装依赖包

默认安装celery是低版本,会报错,所以我们指定版本安装。

pip install celery-with-redis
pip install celery==4.4.7

2、在settings同级目录下创建 celery 文件

# celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

# 设置环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '项目根目录名.settings')

# 注册Celery的APP
app = Celery('需要用celery的app名')
# 绑定配置文件
app.config_from_object('django.conf:settings', namespace='CELERY')

# 自动发现各个app下的tasks.py文件
app.autodiscover_tasks()

3、配置settings文件

# settings
BROKER_URL = 'redis://localhost' # 使用Redis作为消息代理

CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' # 把任务结果存在了Redis

CELERY_RESULT_SERIALIZER = 'json' # 读取任务结果一般性能要求不高,使用可读性更好的JSON
Celery使用

4、在utils(工具包)下新建一个task.py文件

发送手机号的方法是之前已经写好的,所以导入过来即可!参见之前发的容联云手机号验证!

# task.py
from celery.task import task
from .comm import send_message

# 定义发送邮件的方法
@task
def send_msg(mobile,code):
    send_message(mobile,code,5)

5、在接口中调用

# views.py
from utils.tasks import send_msg
def get(self,request):
    res = send_message('187XXXX9493',code,1)

6、先启动django项目 然后另开终端 cd到项目 目录下启动celery 服务

# 也可指定并发数 --autoscale(最多,最少)
celery worker -A 目录名 --loglevel=info --pool=solo

7、开启成功示例

cd到项目目录中,开启cerely,开启成功后会看到[tasks]下有任务列表,下图为空。当请求的时候,会返回一个进程号,即为成功。

在这里插入图片描述

总结

  Cerely非常好用,就是配置的很多,看懂原理就简单很多了,也许学任何东西都一样吧,大家如果用到的时候先看原理,然后跟着我的脚步,一步一步配下来就OK啦!

在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

楼下安同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值