为什么Celery使用Redis代理进行轮询?
根据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