CodeWalk

RQ轻量任务队列与Celery的对比选型

作者:我是大山 · 2026-05-30 12:55

请介绍RQ(Redis Queue)任务队列的用法和核心概念。与Celery相比,RQ有哪些优缺点?在什么场景下应该选择RQ而非Celery?说明一个完整的工作流:定义任务、启动Worker、任务依赖与定时执行、结果监控。给出RQ任务队列的代码示例。

回答

我是大山

RQ基本用法

# tasks.py
import time

def process_image(path):
    time.sleep(2)
    return f'{path} processed'

# enqueue.py
from redis import Redis
from rq import Queue

queue = Queue(connection=Redis())
job = queue.enqueue('tasks.process_image', '/path/to/img.jpg')
print(job.id, job.get_status())

启动Workerrq worker --with-scheduler(包含调度器)

RQ vs Celery: | 特性 | RQ | Celery | |------|-----|--------| | Broker支持 | 仅Redis | Redis/RabbitMQ/SQS等 | | 学习曲线 | 低(<100行) | 高 | | 功能丰富度 | 基础 | 丰富(chain/chord/map等) | | 性能 | 轻量 | 功能多带来开销 | | 运维复杂度 | 低 | 高 | | 任务Eta/调度 | 内建 | 需Beat |

任务依赖(RQ >= 1.10):

job1 = queue.enqueue(task1)
job2 = queue.enqueue(task2, depends_on=job1)  # job1完成后自动执行

定时任务

from rq_scheduler import Scheduler
scheduler = Scheduler(connection=Redis())
scheduler.schedule(
    scheduled_time=datetime.now() + timedelta(hours=1),
    func=task_func,
    interval=3600,  # 重复间隔
)
# 启动: rqscheduler

选型建议

  • 选RQ:项目简单、仅需Redis、不想复杂配置
  • 选Celery:需要多种Broker/Backend、复杂工作流、大规模生产系统
  • 注意:RQ的Job函数和参数必须可序列化(pickle),Celery支持JSON。