RQ轻量任务队列与Celery的对比选型
请介绍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())
启动Worker:rq 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。