我试图在celery上执行一个任务,然后用不到10ms的开销阻塞它的结果。
一个自包含的例子(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机器上,每个请求的运行时间大约为40ms。
恕我直言,celery的后端依赖于轮询,所以对于低延迟的要求来说不是很理想吗?
该解决方案将需要交付低于10ms的RTT开销,大约每秒有4台机器添加任务,大约有2个任务工作者实际执行任务。
1条答案
按热度按时间06odsfpq1#
Celery可以(在2023年)在10 ms内返回结果,并且不再轮询Redis。
我最近研究了这个问题,因为我需要一个低延迟的任务队列。Celery可以在同一台机器(i3-10100)上,使用redis或rmq后端,在10 ms内持续完成阻塞分派→结果往返:
x1c 0d1x的数据
Celery仍然比直接使用后端慢。存在序列化、工人/孩子管理和ACK的开销。
Redis特别有一些很好的简单原语,用于手动滚动基本任务队列,这是我最终为延迟敏感应用程序选择的路线。