首页 > 其他分享 >一个比 Celery 轻量好用的异步任务工具

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

时间:2024-04-26 15:15:50浏览次数:25  
标签:异步 RQ 队列 redis Redis Celery 任务 轻量

转载自:https://mp.weixin.qq.com/s/w579duXw7dHIBQuUhD7Vfg

RQ 是 Python 中一个基于 Redis 的简单的,轻量级的异步任务工具。通过 RQ,您可以将耗时的任务放入队列中异步执行,而不会阻塞主应用程序的执行。

# 1、安装

通过 pip 可以直接安装它

$ pip install rq

# 2、核心概念

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

 Queue

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

示例:

from rq import Queue
from redis import Redis

# 连接到 Redis 服务器
redis_conn = Redis()

# 创建一个队列
q = Queue('default', connection=redis_conn)  # 第一个参数是Queue的名称,可以不传,默认为default

 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)

 Worker

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

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

示例:

$ rq worker

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

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

$ rq worker low high default

# 3、web 界面

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

$ rq-dashboard

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

# 4、查看任务结果

在 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}")

# 5、与 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。

标签:异步,RQ,队列,redis,Redis,Celery,任务,轻量
From: https://www.cnblogs.com/testzcy/p/18160112

相关文章

  • C#同步方法中如何调用异步方法
    最近看了个关于同步方法中调用异步方法的文章,有感而发,先把代码放在这里,有时间再补充理解namespace同步方法中调用异步方法{internalclassProgram{//staticvoidMain(string[]args)//{//Console.WriteLine("start"+DateTim......
  • 汉得PI&PO教材-Adapter使用-实例6 proxy2jdbc(异步)V1.0
    汉得PI&PO教材系列   汉得PI&PO教材-Adapter使用-实例6proxy2jdbc(异步)         仅限汉得内部使用 作者:汉得顾问版本:1.0日期:2017-02-01图标 图标含义 警告 示例 注释 建议......
  • 要把 10M 时钟域下的⼀个模 10 计数器的值,传递到异步的 100M 时钟域下。以下说法 正确
    选项:A、可以把计数值转换成格雷码,再⽤100M时钟采样B、可以通过异步fifo传递计数值C、可以⽤计数值+握⼿信号的⽅式传递D、可以先⽤100M时钟把计数值打2拍,再采样答案:BC解析:A、之所以不能使用格雷码做同步的原因是模10计数器的技术范围在0~9,如果是0-15就可以用了......
  • C#异步编程
    既然有了多线程为什么还需要异步   异步并不意味者多线程,单线程同样可以异步异步默认借助线程池   多线程经常阻塞,二异步要求不阻塞多线程与异步的使用场景不同  多线程:       适合CPU密集型操作 适合长期运行任务线程的创建与开销较大......
  • 异步编程模型
    本文内容异步编程提升响应能力异步方法易于编写异步方法的运行机制API异步方法显示另外6个通过使用异步编程,你可以避免性能瓶颈并增强应用程序的总体响应能力。但是,编写异步应用程序的传统技术可能比较复杂,使它们难以编写、调试和维护。C#支持简化的方法,即异步编程,它......
  • 重磅新品发布!云耀数据库HRDS,享受轻量级的极致体验
    本文分享自华为云社区《重磅新品发布!云耀数据库HRDS,享受轻量级的极致体验!》,作者:GaussDB数据库。 所谓,凡有井水处,即能歌柳词。大数据时代,凡有数据处,必有数据库。随着业务需求的不断扩大和数据量的激增,数据库的使用场景渗透到了生活的方方面面,不再是大型企业或技术部......
  • 【转载】异步 LINQ
    原文:https://blog.csdn.net/zls365365/article/details/124395742LINQ这个东西,出来很早了,写过几年代码的兄弟们,或多或少都用过一些。早期的LINQ,主要是同步的,直到C#8.0加入IAsyncEnumerable,LINQ才真正转向异步。这本来是个非常好的改变,配合System.Linq.Async库提供的扩......
  • 如何基于Django中的WebSockets和异步视图来实现实时通信功能
    本文分享自华为云社区《结合Django中的WebSockets和异步视图实现实时通信功能的完整指南》,作者:柠檬味拥抱。在现代Web应用程序中,实时通信已经成为了必不可少的功能之一。无论是在线聊天、实时数据更新还是实时通知,都需要通过实时通信技术来实现。Django作为一个强大的Web框架,提......
  • java 异步任务,定时任务,邮件发送
    java异步任务,定时任务,邮件异步任务异步方法注解:@Async主程序开启异步注解功能:@EnableAsync定时任务开启定时功能的注解在main:@EnableSchedulingTaskScheduler:任务调用者TaskExecutor:任务执行者@EnableScheduling开启定时功能的注解@Scheduled固定......
  • C# 异步编程Task(三) async、await
    一、async和await两个修饰符C#5.0的时候引入了async和await两个修饰符,成为异步编程的核心关键字。async是修饰符,表明方法含有异步操作,但并不是说整个方法是异步的。async修饰的方法会先同步执行到第一处await的地方而后开始异步。await可以理解为一异步特有的“return”。即返回......