浅谈 Celery 分布式队列

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。

2. Celery的使用

2.1 安装Celery

  pip install celery

2.2 目录结构:

  

2.3 主要步骤:

1. 创建Celery对象并进行配置

 # -- main.py 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 : 

-------------- [email protected] 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] [email protected] 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充当中间件的情况 后续将会继续补充

    

    

  

原文地址:https://www.cnblogs.com/Jaho/p/9266157.html

时间: 2024-10-09 23:26:00

浅谈 Celery 分布式队列的相关文章

Celery学习---Celery 分布式队列介绍及安装

Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景中可用的例子: 1. 你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情. 2. 你想做一个定时任务,比如每天检测

浅谈数据结构之链队列(六)

前面我们讲了队列的顺序存储结构,现在我们来看看队列的链式存储结构.队列的链式存储其实就是线性表的单链表结构,只不过它是尾进头出而已,通常我们把它简称为链队列.为了操作上的方便,我们将队头指针front指向链队列的头结点,而队尾指针rear则指向终端结点.注意:当队列为空时,指针front和rear都指向头结点. 在这里,我们再介绍一下循环队列.循环队列是为了避免数组插入与删除数据时需要移动数据而引入的,我们一般把队列的这种头尾相接的顺序存储结构称为循环队列.对于循环队列和链队列相比较来说,循环队

浅谈栈、队列

所谓栈和队列其本质都是一种存储信息的方法,最主要的差别就是两者的存取方式不同,栈相当于是一个一端开口一端封闭的空心玻璃柱,每存入一个数据就是扔进一个与管口等粗的球,取出数据时只能取最上头的,也就是最后一个放进去的,并且当管中无球时,无法取数据:相对而言,队列相当于是一个两端开口的空心玻璃柱,每存入一个数据,就从后端插入一个与管口等粗的球,取数据时只能从前端取不能从后段取,同样当其中无球时无法取. 从上述介绍中可以发现两者各有优势,但队列有一个显著问题,但插入取出次数多时,可能仅有几个数据但存储却

浅谈栈和队列

### 栈 栈模型 栈(stack)是限制对元素的插入(push)和删除(pop)只能在一个位置上进行的表,该位置是表的末端,叫做栈的栈顶(top). 栈的基本操作只有两种,压入栈(push)和弹出栈顶(pop),且只能作用于栈顶.(只有栈顶元素是可访问的 你可以把栈结构理解成一个底部封闭,顶部打开的桶.最先进去的元素一定是最后才能取出,最晚进去的元素一定是最先取出. 因此栈又叫做LIFO(后进先出,Last In First Out)表. 栈的优势 栈的操作是常数时间的,而且是以非常快的常数时

浅谈分布式消息技术 Kafka

http://www.linkedkeeper.com/1016.html Kafka的基本介绍 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志.访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目. 主要应用场景是:日志收集系统和消息系统. Kafka主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化

浅谈分布式消息技术 Kafka(转)

一只神秘的程序猿. Kafka的基本介绍 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志.访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目. 主要应用场景是:日志收集系统和消息系统. Kafka主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能.

搞懂分布式技术21:浅谈分布式消息技术 Kafka

搞懂分布式技术21:浅谈分布式消息技术 Kafka 浅谈分布式消息技术 Kafka 本文主要介绍了这几部分内容: 1基本介绍和架构概览 2kafka事务传输的特点 3kafka的消息存储格式:topic和parition 4副本(replication)策略:主从broker部署和partition备份,以及选主机制 5kafka消息分组,通过comsumergroup实现主体订阅 6push和pull的区别,顺序写入和消息读取,零拷贝机制 Kafka的基本介绍 Kafka是最初由Linkedi

搞懂分布式技术16:浅谈分布式锁的几种方案

搞懂分布式技术16:浅谈分布式锁的几种方案 前言 随着互联网技术的不断发展,数据量的不断增加,业务逻辑日趋复杂,在这种背景下,传统的集中式系统已经无法满足我们的业务需求,分布式系统被应用在更多的场景,而在分布式系统中访问共享资源就需要一种互斥机制,来防止彼此之间的互相干扰,以保证一致性,在这种情况下,我们就需要用到分布式锁. 分布式一致性问题 首先我们先来看一个小例子: 假设某商城有一个商品库存剩10个,用户A想要买6个,用户B想要买5个,在理想状态下,用户A先买走了6了,库存减少6个还剩4个,

分布式队列 Celery

详情参见: 分布式队列神器 Celery 个人学习总结后续更新……