一个比 Celery 轻量好用的异步任务工具

文章目录

    • 1、RQ安装
    • 2、RQ基本概念
      • 2.1、Queue
      • 2.2、Job
      • 2.3、Worker
    • 3、RQ 高级用法
      • 3.1、自定义任务失败处理
      • 3.2、任务依赖关系
      • 3.3、定时任务
    • 4、RQ web 界面
    • 5、查看任务结果
    • 6、RQ 与 celery 对比
    • 7、总结


在这里插入图片描述

Python RQ(Redis Queue)是一个轻量级的异步任务队列库,它基于Redis构建,并使用Python编写。RQ的主要功能是帮助开发者将长时间运行的任务(如发送邮件、处理大数据等)放入队列中,然后由后台进程异步处理,以提高应用程序的性能和响应能力。

1、RQ安装

通过 pip 可以直接安装它

$ pip install rq

或者如果你想尝新的话,从 github 安装开发版:

$ pip install -e git+git@github.com:nvie/rq.git@master#egg=rq

2、RQ基本概念

在 Python 的 RQ 库中,有三个核心概念:队列(Queue)、工作者(Worker)和任务(Job)。下面我将详细介绍它们的概念,并且给出相应的示例说明。

在这里插入图片描述

2.1、Queue

RQ 中,队列是用来存储待处理任务的地方。当您想要执行一个耗时的任务时,可以将该任务放入队列中,然后由Worker来异步执行。

示例:

from rq import Queue
from redis import Redis# 连接到 Redis 服务器
redis_conn = Redis()# 创建一个队列
q = Queue('default', connection=redis_conn)  # 第一个参数是Queue的名称,可以不传,默认为default

2.2、Job

任务是需要执行的具体操作,可以是函数、方法或任何可调用的对象。当任务被放入队列后,工作者会从队列中取出任务并执行它。

示例:

from rq import Queue
from redis import Redis# 定义一个需要执行的任务函数
def my_task(x, y):return x + y# 将任务放入队列并执行
redis_conn = Redis()
q = Queue(connection=redis_conn)
job = q.enqueue(my_task, 1, 2)

2.3、Worker

worker 是 RQ 中负责执行队列中任务的组件。worker 会从队列中取出任务并执行,从而实现任务的异步处理。

worker 是一个完全独立的进程,通过命令行来启动它

示例:

$ rq worker

这会启动一个名为 “default” 的工作者,它会从默认队列中获取任务并执行。

若在实际使用中,有多个队列,队列之间的任务有优先级,可以在启动 worker 时,将这个优先级顺序传入,比如下面这个例子,排在前面的Queue里面的Job将优先被运行(low > high > default)

$ rq worker low high default

3、RQ 高级用法

除了基本用法之外,Python RQ 还提供了一些高级功能和选项,以满足更复杂的任务队列管理需求。

3.1、自定义任务失败处理

如果任务执行失败,RQ 可以自定义处理失败任务的方式。可以创建一个自定义的失败处理函数,并将其传递给 enqueue 方法的 failure 参数。

# main.pydef custom_failure_handler(job, exc_type, exc_value, traceback):# 在任务执行失败时执行自定义操作print(f"Job failed: {job.id}")print(f"Exception Type: {exc_type}")print(f"Exception Value: {exc_value}")print(f"Traceback: {traceback}")# 向队列中添加任务,并设置自定义失败处理函数
job = queue.enqueue(fibonacci, 10, failure=custom_failure_handler)

3.2、任务依赖关系

有时,任务之间存在依赖关系,其中一个任务需要等待另一个任务完成后才能执行。RQ 可以管理任务的依赖关系。

# main.py# 创建多个任务
job1 = queue.enqueue(fibonacci, 5)
job2 = queue.enqueue(fibonacci, 10)
job3 = queue.enqueue(fibonacci, 15)# 设置任务依赖关系
job2.dependency = job1
job3.dependency = job2

3.3、定时任务

如果需要执行定时任务,RQ 提供了一个方便的方式来处理定时任务。可以使用 schedule 模块来安排任务的执行时间。

# main.pyfrom rq import get_scheduler# 创建任务调度器
scheduler = get_scheduler(connection=redis_conn)# 向任务调度器添加定时任务
job = scheduler.schedule(scheduled_time=datetime.now() + timedelta(minutes=30),func=fibonacci,args=[10],
)

在这个示例中,首先创建了一个任务调度器,然后使用 schedule 方法来安排任务在未来的某个时间执行。

4、RQ web 界面

RQ 还提供了一个 Web 界面,可用于监控和管理任务队列。您可以通过以下方式启动 Web 界面:

$ rq-dashboard

然后访问 http://localhost:9181 查看队列状态和任务执行情况。

5、查看任务结果

RQ 中,您可以通过多种方式查看任务的执行情况。

方法一

job.get_status():查询任务的当前状态。该方法将返回一个字符串,表示任务的状态。任务状态可能是 “queued”(等待执行)、“started”(已开始)、“finished”(已完成)或 “failed”(失败)。

from rq import Queue
from redis import Redis# 定义一个需要执行的任务函数
def my_task(x, y):return x + y# 将任务放入队列并执行
redis_conn = Redis()
q = Queue(connection=redis_conn)
job = q.enqueue(my_task, 1, 2)# 查询任务状态
status = job.get_status()
print(f"Task status: {status}")

方法二

job.result:获取任务的执行结果。如果任务还没有执行完毕,该属性将会阻塞直到任务执行完毕并返回结果。

需要注意的是,如果任务还没有执行完成,调用 job.result 将会阻塞当前线程。

from rq import Queue
from redis import Redis# 定义一个需要执行的任务函数
def my_task(x, y):return x + y# 将任务放入队列并执行
redis_conn = Redis()
q = Queue(connection=redis_conn)
job = q.enqueue(my_task, 1, 2)# 获取任务结果
result = job.result
print(f"Task result: {result}")

6、RQ 与 celery 对比

RQ 相比, Celery 可能更加知名一点,它们都是 Python 中常用的用于处理异步任务的库,它们在实现异步任务处理的方式和功能特性上有一些区别。

RQ

  • 简单易用:RQ 设计简单,易于上手,适合小型项目或对任务处理需求不复杂的场景。
  • 基于 Redis:RQ 使用 Redis 作为后端存储队列,利用 Redis 的数据结构来管理任务队列。
  • 轻量级:由于设计简单,RQ 相对较轻量,适合快速集成和使用。
  • 监控和管理:RQ 提供了简单的 Web 界面和命令行工具,用于监控和管理任务队列。

Celery

  • 功能强大:Celery 是一个功能丰富的分布式任务队列,支持延迟任务、定时任务、优先级队列等高级特性。
  • 可扩展性:Celery 提供了丰富的插件和扩展机制,可以满足复杂的任务处理需求。
  • 多后端支持:Celery 支持多种消息中间件作为任务队列后端,如 Redis、RabbitMQ、Amazon SQS 等。
  • 社区活跃:Celery 拥有庞大的社区支持和文档资源,适合在复杂项目中使用。

在选择 RQ 还是 Celery 时,可以自身情况进行选择:

  • 项目规模:对于小型项目或简单的任务处理需求,RQ可能是一个更轻量级和直观的选择;而对于复杂的任务处理需求或大型项目,Celery提供的功能和扩展性更适合。
  • 技术栈:如果已经在项目中使用了 Redis,并且对任务处理需求不复杂,可以考虑选择 RQ;如果需要更复杂的任务调度和处理功能,或者需要与其他消息中间件集成,可以选择 Celery。

7、总结

Python RQ 是一个强大而简单的任务队列管理库,用于管理和执行后台任务。无论是开发 Web 应用程序、数据处理管道还是其他类型的应用,RQ 都可以轻松管理和执行任务,提高应用程序的性能和可维护性。希望本文的介绍和示例能够帮助大家入门 Python RQ,并开始在项目中使用分布式任务队列。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/306373.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑文件名乱码,数据恢复有高招!

在日常使用电脑的过程中,突然遭遇文件名乱码的情况,确实让人头疼不已。原本井井有条的文件目录,一下子变得杂乱无章,文件名变成了一堆无意义的乱码字符。这种情况不仅影响了文件的正常使用,还可能导致重要数据的丢失。…

当努力成为日常,你准备好“戒瘾”了吗

不知道从什么时候开始,我们的朋友圈里充斥着各种“努力打卡”、“奋斗不息”的标语。大家仿佛一夜之间都变成了“卷王”,不是在努力就是在努力的路上…… 卷王争霸 努力成瘾的序幕 在每个看似充满正能量的背后,却隐藏着一个不容忽视的现象—…

java快速构建飞书API消息推送、消息加急等功能

文章目录 飞书机器人自定义机器人自定义应用机器人 自定义应用发送消息普通文本 text富文本 post图片 image文件 file语音 audio视频 media消息卡片 interactive分享群名片 share_chat分享个人名片 share_user 批量发送消息消息加急发送应用内加急发送短信加急 发送电话加急spr…

论文复现:nn.L1Loss()

nn.L1Loss() 是 PyTorch 中的一个损失函数,属于 torch.nn 模块的一部分。它计算预测值和真实值之间差的绝对值的平均值,也就是 L1 距离(或曼哈顿距离)。这个损失函数常用于回归任务,特别是当你希望减少异常值对总体损失…

核心api实操-Activiti7从入门到专家(5)

背景 上一节已经搭建了,具体的开发环境,数据库,并且找了一个可以用bpmnjs流程设计器,这一些,我们对核心api做个基础的实操,有个感性的认知,另外对数据库和基本数据流动有个理解。 部署 模板部…

深度学习pytorch实战第P2周:CIFAR10彩色图片识别

>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **🍖 原作者:[K同学啊](https://mtyjkh.blog.csdn.net/)** 零、引言(温故而知新&#xff…

智能合约平台开发指南

随着区块链技术的普及,智能合约平台已经成为了这个领域的一个重要趋势。智能合约可以自动化执行合同条款,大大减少了执行和监督合同条款所需的成本和时间。那么,如何开发一个智能合约平台呢?以下是一些关键步骤。 一、选择合适的区…

MySQL学习笔记2——基础操作

基础操作 一、增删改查1、添加数据2、删除数据3、修改数据4、查询语句 二、主键三、外键和连接1、外键2、连接 一、增删改查 1、添加数据 INSERT INTO 表名[(字段名[,字段名]…)] VALUES (值的列表); --[]表示里面的内容可选添加数据分为插入数据记录和插入查询结果 插入数据…

AI+BI,欢迎数据分析进入大模型时代

过去一年大模型应用集中爆发,中关村科金作为领先的对话式AI技术解决方案提供商,基于各个行业真实的业务痛点,围绕营销、服务与运营场景,创新打造和升级了知识助手、投顾助手、智能陪练等大模型应用,全面赋能客户经理展…

【INNODB引擎篇】深奥探究Innodb存储引擎

🔥作者主页:小林同学的学习笔录 🔥mysql专栏:小林同学的专栏 目录 1.InnoDB引擎 1.1 逻辑存储结构 1.2 架构 1.2.1 概述 1.2.2 内存结构 1.2.3 磁盘结构 1.2.4 后台线程 1.3 事务原理 1.3.1 事务基础 1.3.2 redo log 1.…

鸿蒙TypeScript学习第12天【Map对象】

1、TypeScript Map 对象 Map 对象保存键值对,并且能够记住键的原始插入顺序。 任何值(对象或者原始值) 都可以作为一个键或一个值。 Map 是 ES6 中引入的一种新的数据结构,可以参考gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md 2、创…

【架构-九】数据库反规范化设计

什么是反规范化设计? 反规范化是指为了提高数据库的性能或满足特定需求而向数据库中增加冗余数据的过程。与数据库规范化设计正好相反,反规范化的目的是减少查询的复杂度,加快数据检索的速度。主要的反规范化手段如下: 优点&am…

YOLOv8打印模型结构配置信息并查看网络模型详细参数:参数量、计算量(GFLOPS)

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

Python3.7编程之病毒

基础篇 什么是病毒 病毒,指的是一些通过非法手段获取系统的一些权限,然后进行破坏或者盗取。 病毒分为两类: 1、破坏型 这类病毒往往会将系统弄的乱七八糟,比如把你的U盘删光,把你的系统背景调成黑客图片&#xff0c…

python 的join函数

join函数是一个对字符串处理的函数 字符串.join(str)的含义是把字符串加入到str的每一个间隙里面 如 str1234 ,.join(str) #打印的结果为 1,2,3,4

类和对象【一】类和对象简介

文章目录 C的类与C语言结构体的区别【引入类】类的定义类体中的成员函数的实现类中的访问限定符C中class和struct的区别 类的作用域类的实例化类中成员的存储位置类的大小 C的类与C语言结构体的区别【引入类】 类里面不仅可以定义变量还可以定义函数 例 类具有封装性【将在该…

abap 字符超过255的显示

大家都知道SAP ALV的一个单元格最大显示的长度就是255 意思就是你的这个字段在内表里面即使是超过255位,也无法只能显示255 如果客户的需求是需要看到完整的消息内容, 最简单的就是将整个程序的数据右键导出到excle中去查看 如果客户执意需要在ALV中…

python+django教师业绩考评考核评分系统flask

在设计过程中,将参照一下国内外的一些同类网站,借鉴下他们的一些布局框架,将课题要求的基本功能合理地组织起来,形成友好、高效的交互过程。开发的具体步骤为:   第一步,进行系统的可行性分析&#xff0c…

佛山市人工智能产业生态交流会:实在智能Agent引领“智造浪潮”

制造业,实体经济的核心,技术创新的先锋,供给侧结构性改革的关键。在新一轮产业竞争中,数字化转型成为制造业升级的必由之路,是引领未来的重要抓手。 为促进数字经济赋能实体经济,加快人工智能技术的推广应用…

汇编入门--基础知识(1)

1.汇编语言的概念 汇编语言是一种低级编程语言,它与计算机的机器语言非常接近,但比机器语言更易于人类阅读和理解。汇编语言是用一系列的助记符来表示机器语言的操作码和操作数。每种计算机体系结构(如x86、ARM等)都有自己的汇编语…