Celery能在10毫秒内返回任务结果吗?

1 投票
1 回答
997 浏览
提问于 2025-04-18 10:47

我正在尝试在celery上执行一个任务,然后在结果上阻塞,要求延迟小于10毫秒。

这是一个自包含的示例(tasks.py):

from celery import Celery

app = Celery('tasks', broker='librabbitmq://guest@localhost//', backend='amqp')

@app.task
def add(x, y):
    return x + y

测试脚本:

from timeit import timeit
from tasks import add

def f():
    add.delay(2, 2).get()

timeit(f, number=100)

在我的i5 8GB内存的Debian Linux机器上,每个请求大约需要40毫秒。

在我看来,celery中使用redis作为结果后端依赖于轮询,所以对于低延迟的需求来说并不是最理想的选择?

这个解决方案需要在10毫秒的往返时间内完成,预计有大约4台机器每秒添加任务,还有大约2个任务工作者实际执行这些任务。

1 个回答

0

在2023年,Celery可以在10毫秒内返回结果,而且不再需要不停地去查询Redis。

我最近研究了这个,因为我需要一个延迟低的任务队列。Celery在同一台机器(i3-10100)上,使用Redis或RMQ作为后端时,能够稳定地在10毫秒内完成一次阻塞的任务调度和结果返回。

这里输入图片描述

来源:Python任务队列延迟

不过,Celery的速度还是比直接使用后端要慢。这是因为在处理数据、管理工作进程和确认消息时会有一些额外的开销。

特别是Redis提供了一些简单的基本功能,可以自己手动搭建一个基本的任务队列,这也是我为我的低延迟应用选择的方案。

撰写回答