美文网首页
Django之 Celery 分布式队列

Django之 Celery 分布式队列

作者: NameJaho | 来源:发表于2018-07-09 15:30 被阅读0次

Q1: Django开发Web项目时遇到一个问题,如何解决大量用户在同一时间注册,短信发送延迟的问题?

A1: 多任务
   ① 封装一个发送短信的函数   
   ② 创建进程、线程、协程调用发送短信的函数

Q2: 创建的进程、线程、协程和Django网站服务器在同一个电脑上,并且调用顺序也是不确定的 所以A1 OUT

A2: Celery(异步任务队列):

   ① celery中的任务发出者,中间人和任务执行着可以在不同的电脑上
   ② celery 中的任务会进行排序,先添加的任务先被worker执行

1. Celery的介绍

Celery是Python开发的分布式任务调度模块,通过它我们可以轻松地实现任务的异步处理,Celery主要有以下几个优点:

  1. 它可以让任务的执行同主程序完全脱离,甚至不在同一台主机内。

  2. 它通过队列来调度任务,不用担心并发量高时系统负载过大。

  3. 它可以用来处理复杂系统性能问题,却又相当灵活易用。

   还是举用户注册的例子,比如同一时间有100个用户要注册,此时网络很差,请求到达短信系统的时间将会很长,如果短信系统迟迟无法回应,会导致后续的代码无法执行,造成用户长时间地等待,影响用户的体验;使用了Celery异步消息队列,只要发布者将发送短信的任务送至中间件,后续无需做任何事情,worker会监听任务队列并执行。

   在我的理解中 Celery主要有三大模块组成:
① 任务发出者:发出执行的任务函数;
② 任务执行者(worker):即执行任务的程序,可以有多个并发。它实时监控消息队列,获取队列中调度的任务,并执行它;
③ 中间人(broker):即任务调度队列,它是一个生产者消费者模式的任务队列,即任务发出者发出任务到任务队列中,任务执行者从任务队列中取出任务并执行,执行调度可以是顺序调度也可以是计划时间调度;Celery推荐的中间人(中间件)有RabbitMQ和Redis,本文使用的是Redis。

Celery

2. Celery的使用

2.1 安装Celery

pip install celery

2.2 目录结构:

image

2.3 主要步骤:

  1. 创建Celery对象并进行配置
1 from celery import Celery 
2 
3 # 创建celery应用
4 app = Celery('celery_name')
5 
6 # 从conf.py中导入celery 配置 
7 app.config_from_object('celery_tasks.conf')
8 
9 # 自动注册celery任务
10 app.autodiscover_tasks(['celery_tasks.sms'])

2. 定义任务函数(文件名必须为 tasks.py)

# --tasks.py   
1 from celery_tasks.main import app 
2 
3 @app.task(name='test_task') 
4 def task(x, y): **# 参数可不传** 
5 print('%s,%s' % (x, y))

3. 启动worker(celery -A Celery对象包路径 worker -l info)

>>>:celery -A celery_tasks.main worker -l info   # (l:事件级别 info:打印信息)**

OUT : 
-------------- celery@ubuntu v4.2.0 (windowlicker)
---- **** ----- 
--- * *** * -- Linux-4.4.0-31-generic-x86_64-with-Ubuntu-16.04-xenial 2018-07-04 19:09:40
-- * - **** --- 
- ** ---------- [config]
- ** ---------- .> app: celery_name:0x7f785faee518 **# celery_name  应用名**
- ** ---------- .> transport: redis://127.0.0.1:6379/14 **# 中间人地址**
- ** ---------- .> results: disabled://
- *** --- * --- .> concurrency: 1 (prefork) **# 启动了几个worker 默认cpu几核启动几个**
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- 
-------------- [queues]
.> celery exchange=celery(direct) key=celery

[tasks]
. test_task **# 任务名**

[2018-07-04 19:09:40,913: INFO/MainProcess] Connected to redis://127.0.0.1:6379/14
[2018-07-04 19:09:40,930: INFO/MainProcess] mingle: searching for neighbors
[2018-07-04 19:09:41,960: INFO/MainProcess] mingle: all alone
[2018-07-04 19:09:42,016: INFO/MainProcess] celery@ubuntu ready.

4. 发送任务

>>> : task.delay('你好','Jaho')

OUT : 

[2018-07-04 19:15:14,413: INFO/MainProcess] Received task: test_task[81c86c98-1550-4d60-ab19-2e148d975b3d]   
[2018-07-04 19:15:14,414: WARNING/ForkPoolWorker-1]  你好,Jaho
[2018-07-04 19:15:14,415: INFO/ForkPoolWorker-1] Task test_task[81c86c98-1550-4d60-ab19-2e148d975b3d] succeeded in 0.00043077800000901334s: None

3. 最后 Celery还有强大的定时任务功能还有使用RabbitMQ充当中间件的情况 后续将会继续补充

如若有误,欢迎指出,感谢!

相关文章

  • Django之 Celery 分布式队列

    Q1: Django开发Web项目时遇到一个问题,如何解决大量用户在同一时间注册,短信发送延迟的问题? A1: 多...

  • python-分布式任务队列

    celery 分布式任务队列工具 Celery是一个分布式任务队列工具,是一个异步的任务队列基于分布式消息传递 基...

  • Celery初体验

    Celery与任务队列 Celery是Python中流行的分布式任务队列。所谓分布式任务队列,是一种将任务分发到不...

  • Celery初级

    什么是Celery Celery是管理分布式队列工具,可用于进行任务队列的使用和管理 Celery的结构 Brok...

  • Celery 周期任务运行一段时间后意外停止

    Celery周期抓取数据 用Python Django做了一个网站。后端有些周期抓数据的需求,分布式任务队列Cel...

  • celery学习笔记

    Celery 标签(空格分隔): celery Celery是一个分布式任务队列工具,是一个异步的任务队列基于分布...

  • 实现简单的python3+flask+celery+redis框

    详解python3+flask+celery+redis Celery是什么? Celery是个异步分布式任务队列...

  • celery--turorial

    Celery Celery (芹菜)是基于Python开发的分布式任务队列。它支持使用任务队列的方式在分布的机器/...

  • celery redis rabbitMQ各是什么及之间的区别?

    Celery: Celery是基于Python开发的分布式任务队列。它支持使用任务队列的方式在分布的机器/进程/线...

  • Python Celery学习扎记

    Celery是什么 Celery是一个管理分布式队列的工具,它封装好了常见任务队列的各种操作,能够快速进行任务队列...

网友评论

      本文标题:Django之 Celery 分布式队列

      本文链接:https://www.haomeiwen.com/subject/zlcauftx.html