为什么Celery使用Redis代理进行轮询?

5 投票
1 回答
2994 浏览
提问于 2025-04-17 21:59

根据Celery的文档,当使用Redis作为后端时,Celery会定期检查结果,默认的检查间隔是0.5秒。

一个初学者可能会认为,任何使用Redis的队列系统至少应该尝试利用它的LIST或PUBSUB机制。那么,为什么Celery不这样做,而是选择定期检查呢?

举个例子,当通过Celery工作进程运行时,以下代码在调用r.get()时正好需要0.5秒(这就是默认的检查间隔):

from celery import Celery

app = Celery('tasks', broker='redis://localhost:6379/0',
              backend="redis://localhost:6379/0")

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

if __name__ == "__main__":
    r = add.delay(5, 4)
    result = r.get()
    print(result)

1 个回答

5

轮询是任何新结果存储的默认实现,因为它不需要特定于后端的代码。使用Redis的发布/订阅功能是大家希望能实现的功能;不过相关的代码还没有写出来:https://github.com/celery/celery/issues/799

撰写回答