首页 > 其他分享 >celery笔记五之消息队列的介绍

celery笔记五之消息队列的介绍

时间:2023-06-21 23:55:34浏览次数:47  
标签:queue task 队列 笔记 celery tasks blog

本文首发于公众号:Hunter后端
原文链接:celery笔记五之消息队列的介绍

前面我们介绍过 task 的处理方式,将 task 发送到队列 queue,然后 worker 从 queue 中一个个的获取 task 进行处理。

task 的队列 queue 可以是多个,处理 task 的 worker 也可以是多个,worker 可以处理任意 queue 的 task,也可以处理指定 queue 的 task,这个我们在介绍 queue 的时候再做介绍。

这一篇我们来介绍一下存储 task 的队列 queue。

  1. 默认队列 task_default_queue
  2. 定义队列
  3. 将 task 指定到队列 queue 消费

以下的操作都是在 Django 系统的配置中使用。

1、默认队列 task_default_queue

当我们运行一个最简单的延时任务比如 add.delay(1, 2) 时,并没有设置一个消息队列,因为如果我们没有指定,系统会为我们创建一个默认队列。

这个默认的队列被命名为 celery,值在 app.conf.task_default_queue,我们可以查看一下:

from hunter.celery import app
app.conf.task_default_queue

# 输出为 'celery'

2、定义队列

我们可以设想一下这个场景,我们只有一个 worker 处理 task,每个 task 需要处理的时间很长,因为 worker 被占用,这样在我们的任务队列里就会积压很多的 task。

有一些需要即时处理的任务则会被推迟处理,这样的情况下,我们理想的设计是设置多个 worker,多个 worker 分别处理指定队列的 task。

关于 worker 的设置,比如添加多个 worker,给 worker 消费指定队列的 task,我们在 worker 的笔记中再介绍,这里我们介绍一下如何定义队列。

任务队列的定义如下:

# hunter/celery.py

from kombu import Queue

app.conf.task_queues = (
    Queue('blog_tasks', ),
)

当我们定义了任务队列之后,我们可以将 task 指定输出到对应的 queue,假设 blog/tasks.py 下有这样一个 task:

# blog/tasks.py
from celery import shared_task

@shared_task
def add(x, y):
    return x + y

接下来我们调用这个 task 的时候,需要指定队列:

from blog.tasks import add
add.apply_async((1, 2), queue='blog_tasks')

如果我们就这样配置 celery,这个时候如果我们直接再调用 delay() 函数,也就是不指定 queue 的话,会发现我们发出的 task 是不能被 worker 处理的。

也就是说,下面的操作是不起作用的:

from blog.tasks import add
add.delay(1, 2)  # 此时,我们的调用不会被队列接收到

如果需要在调用 task 的时候不指定队列,使用系统默认的队列,这个时候我们需要额外来指定一个 task_default_queue,celery 的配置如下:

# hunter/celery.py

app.conf.task_queues = (
    Queue('blog_tasks'),
    Queue('default_queue'),
)
app.conf.task_default_queue = 'default_queue'

这样,我们在使用延时任务的时候,就不需要指定 queue 参数了,都会走我们的默认 task 队列:

from blog.tasks import add
add.delay(1, 2)  # 队列会被 default_queue 接收到

而如果我们想实现 add 的延时任务走的是 blog_tasks 这个队列,但是我们在调用的时候不想那么麻烦每次都指定 queue 参数,这个就需要用到 task_routes 配置项了。

3、将 task 指定到队列 queue 消费

如果我们想某些函数使用指定的 queue,我们可以使用 task_routes 配置项来操作。

现在我们有两个 application,blog 和 polls,这两个 application 下都有各自的 tasks,文件的内容如下:

# blog/tasks.py
from celery import shared_task

@shared_task
def add(x, y):
    return x + y

@shared_task
def minus(x, y):
    return x - y
# polls/tasks.py
from celery import shared_task

@shared_task
def multi(x, y):
    return x * y

我们想要实现的最终的目的是在调用延时任务的时候,可以直接使用 delay() 的方式,不需要使用 apply_async(queue='xx')。

我们想要实现的功能是,polls/tasks.py 下的所有的延时任务以及 blog/tasks.py 下的 add() 函数进入 queue_1 队列

blog 下的 minus() 函数进入 queue_2 队列

其他所有的 task 都走默认的队列,default_queue。

我们可以如下配置:

app.conf.task_queues = (
    Queue('queue_1'),
    Queue('queue_2'),
    Queue('default_queue'),
)

app.conf.task_routes = {
    'polls.tasks.*': {
        'queue': 'queue_1',
    },
    'blog.tasks.add': {
        'queue': 'queue_1',
    },
    'blog.tasks.minus': {
        'queue': 'queue_2',
    },
}

app.conf.task_default_queue = 'default_queue'

如果想获取更多后端相关文章,可扫码关注阅读:
image

标签:queue,task,队列,笔记,celery,tasks,blog
From: https://www.cnblogs.com/hunterxiong/p/17497326.html

相关文章

  • 【数据结构与算法】用队列实现栈
    ......
  • opencv学习笔记(七)
    图像金字塔:用于图像的分辨率降低。它通过连续的图像平滑和下采样操作来生成一系列分辨率逐渐降低的图像。构建过程:1、将原始图像作为底层2、应用高斯滤波器对当前的图像进行平滑处理,以减少图像中的高频细节。高斯滤波器通过卷积运算在图像上进行平滑操作,使得图像变得更......
  • 外设驱动库开发笔记54:外设库驱动设计改进的思考
      不知不觉中我们已经发布了五十多篇外设驱动的文章。前段时间有一位网友提出了一些非常中肯的建议,这也让我们开始考虑怎么优化驱动程序设计的问题。在这一篇中我们将来讨论这一问题。1、问题分析  首先我们来分析一下网友提出的几点问题。第一点是说在驱动设计时,使用了type......
  • opencv学习笔记(六)
    Canny边缘检测:图片必须先转换为灰度图像主要步骤:1、噪声抑制:使用高斯滤波器,对图像进行平滑处理;2、计算梯度:计算每个像素点的梯度强度和方向;3、非极大值抑制:在梯度方向上,对梯度幅值进行非极大值抑制,保留局部最大值点作为候选边缘;4、双阈值检测:根据设定的高阈......
  • Linux 学习笔记
    Linux学习笔记Linux目录结构了解Linux的目录结构有助于我们管理Linux系统。目录作用/binbin是Binaries(二进制文件)的缩写,这个目录存放着最经常使用的命令。/boot这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/devdev......
  • VINS-Fusion学习笔记(一)
    1.operator的用法c++工程文件结构:test.h具体:#include<iostream>usingnamespacestd;classV_3d{public: doublex,y,z; V_3d(doublex_,doubley_,doublez_):x(x_),y(y_),z(z_) { cout<<x<<","<<y<<","<<z<......
  • 网络单纯形 学习笔记
    网络单纯形算法是一种神奇的算法。它可以求解带负圈的费用流,可以过HLPP板子,但它的(最坏)复杂度好像是指数级,尽管我并不会证感性理解:它和线规算法simplex有许多相似之处,而simplex(最坏)是指数级的.虽然但是,据CF[1]上所讲,它的平均时间复杂度是\(O(VE)\),且常数较小(无LCT情况......
  • 【笔记】大一下数值分析碎碎念——数值积分与微分
    数值微分与积分数值微分:只利用\(f(x)\)来计算\(f',f'',\cdots\)比如\(f'(x_0)\approx\frac{f(x_0+h)-f(x_0)}{h}\)两点前向差分。\(f'(x_0)\approx\frac{f(x_0+h)-f(x_0-h)}{2h}\)三点中心差分。误差分析:设\(f\inC^2[a,b]\)\[f(x_0+h)=f(x_0)......
  • 深度学习阅读笔记(四)之卷积网络CNN
    卷积神经网络  17.《基于卷积神经网络的木材缺陷识别》(具体应用)(1)主要内容:采用卷积神经网络(CNN)来建立木材缺陷识别系统。详细介绍了CNN网络的基本结构和技术特点。详细介绍了实验CNN网络模型的构件。(2)采用方法:卷积神经网络(CNN)(3)特点:权值共享,下采样,局部感受野(4)优点:卷积神经网络在处......
  • 深度学习论文阅读笔记(三)之深度信念网络DBN
    深度神经网络   12.《受限波尔兹曼机简介》(1)主要内容:主要介绍受限玻尔兹曼机(RBM)的基本模型、学习算法、参数设置、评估方法、变形算法等,探讨了RBM在未来值得研究的方向。(2)RBM的基本模型和学习算法(描述比较清楚):对比散度学习算法(Gibbs采样),(3)RBM参数设置(叙述比较详细):1)小批量数据处理......