一个比 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.py

def 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.py

from 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,并开始在项目中使用分布式任务队列。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++取经之路(其五)——类和对象拷贝构造函数

概念:拷贝构造函数,只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。 特征: 1. 拷贝构造函数是构造函数的一个重载形式 如: 2. 拷贝…

最强ChatGPT Plus发布!碾压Claude!ChatGPT5即将发布!

原文链接:ChatGPT发布最新版本!新版GPT-4 Turbo重回王座!碾压Claude 那个聪明、强大的 ChatGPT,终于又回来了! ChatGPT也能用上最强的GPT-4 Turbo了!今天,新版GPT-4 Turbo再次重夺大模型排行榜…

Java后端平台的搭建

后端开发准备工作(配置Tomcat) 安装tomcat安装jdk 配置JAVA HONE(到java目录),path(到 bin 目录)解压Tomcat进入到bin目录,双击startup.bat启动tomcat访问 ip端口在conf目录的 server.xml配置端口 后端平台的搭建 创建Web项目(前提搭建好Tomcat配置) 注:一定要提前配置好Ma…

在Ubuntu上安装Docker Compose

Docker Compose 是一个用于定义和管理Docker容器的工具,它使用yml来配置应用的服务、网络和卷等。特别是在定义多个容器时,它非常擅长定义多个容器之间的关系和依赖。 第一步:更新软件包 sudo apt update第二步:安装网络工具cur…

iOS开发如何更改xcode中的Apple ID

在Xcode中更改Apple ID是一项常见的任务,尤其是当你需要切换到另一个开发者账号或者团队时。下面是一个简单的步骤指南,帮助你更改Xcode中的Apple ID: 步骤一:退出当前的Apple ID 1.打开Xcode应用程序。 2.在菜单栏中,…

Rust面试宝典第2题:逆序输出整数

题目 写一个方法,将一个整数逆序打印输出到控制台。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如:123的逆序输出为321,8600的逆序输出为68,-609的逆序输出为-906。 解析 这道题本身并没有什么…

C++数据结构与算法——动态规划子序列系列

C第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C查漏补缺,尤其是树的部分。这一部分计划一个月 (2024.1.30-2024.4.10已完结),任务量确实有点大,包括春…

React-Router路由基础篇(简单易学)

文章目录 系列文章目录前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开…

Github 2024-04-11 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-11统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目4Python项目3JavaScript项目1Cuda项目1Jupyter Notebook项目1非开发语言项目1Dify.AI: 开源的LLM应用程序开发平台 创建周期:29…

【科技】2024最新微信机器人一键部署教程

外话 话说上次写文章好像又过了几个月了…… 其实还是因为马上小升初的各种密考,其它地方不知道,反正广东这块名校基本上都得密考考进去 笔者连考几次都惨不忍睹…… 不过5月份会有一个信息技术特长生招生,看看能不能吧~ 正文 先说&#xff…

【MATLAB源码-第187期】基于matlab的人工蜂群优化算法(ABC)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境: MATLAB 2022a 1、算法描述 Artificial Bee Colony(ABC)算法是一种模仿蜜蜂觅食行为的优化算法,它通过模拟蜜蜂群体的社会结构和行为来解决数学优化问题。本文将详细介绍ABC算法的基本原理、算法流程、以及在实际应用…

(一)Jetpack Compose 从入门到会写

基本概念 Compose 名称由来 众所周知,继承在功能拓展上表现的很脆弱,容易类、函数爆炸,通过代理和包装进行组合会更健壮。 Compose 意为组合,使用上也是把 Compose 函数以 模拟函数调用层级关系的方式 组合到一起,最终…

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

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

Day38: 动态规划 LeedCode:509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 蓝桥杯: 更小的数

对于动态规划问题,拆解为如下五步曲 确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化(容易数组溢出)确定遍历顺序举例推导dp数组 509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐…

事务,MySQL函数和索引详解

文章目录 事务简介提交方式手动提交事务 事务执行流程修改事务的默认提交方式 事务原理四大特性隔离级别 MySQL函数常见的日期函数判断函数case when字符串函数数字函数 MySQL性能(了解)索引概念分类MySQL索引语法数据结构(了解)BTreeBTree好处 优缺点优势劣势 创建原则 事务简…

Golang 并发安全Map容器实践

Golang原生Map容器并非支持并发安全,在实际使用的时候很容易导致条件竞争并造成未知问题,本文介绍了在Golang中如何安全的并发访问Map容器。原文: Concurrent-Safe Map Container in Go Georg Bommeli Unsplash 当多个程序同时尝试写入同一个map时&#…

swiftUI macOS使用webview加载外部网址

import SwiftUI import WebKitstruct ContentView: View {var body: some View {VStack {Text("测试")WebView(urlString: "https://aweb123.com").frame(maxWidth: .infinity, maxHeight: .infinity) // 让 WebView 占据整个可用空间}.frame(minWidth: 20…

给Parallels Desktop虚拟机下的Linux磁盘扩容

本文是以Ubuntu为例演示,涉及到的命令在centos里也同样适用 一、扩容前查看磁盘容量 二、开始扩容操作 第一步:打开PD分配更大的磁盘空间,要保证有足够大的扩容空间 我的pd里给ubuntu分配了64G的磁盘空间,所以我大概还能扩容34G…

VMware 安装配置 Ubuntu(最新版、超详细)

1. 下载安装 VMware ➡️➡️➡️来源:VMware Docs VMware Workstation Pro™ 使专业技术人员能够在同一台 PC 上同时运行多个基于 x86 的 Windows、Linux 和其他操作系统,从而开发、测试、演示和部署软件。 [Step 1]: 点击 VMware Workstati…

loopback和物理接口通信实现远程控制设备

实验流程:设置物理接口的ip 设置loopback的虚拟接口地址 设置远程链接telnet的用户信息和权限 最后需要增加访问到loopback的路由表信息,否则无法通信,多数人这里没设置,导致访问不了loopback地址 路由器的e口不可以直接设置i…