Celery能在10毫秒内返回任务结果吗?
我正在尝试在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提供了一些简单的基本功能,可以自己手动搭建一个基本的任务队列,这也是我为我的低延迟应用选择的方案。