我已经用RabbitMQ安装了Celery。 问题是,对于返回的每个结果,Celery将在Rabbit中创建,在交换celeryresults中使用任务ID进行排队。
我仍然希望得到结果,但是在一个队列上。
我的celeryconfig:
from datetime import timedelta
OKER_URL = 'amqp://'
CELERY_RESULT_BACKEND = 'amqp'
#CELERY_IGNORE_RESULT = True
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT=['json', 'application/json']
CELERY_TIMEZONE = 'Europe/Oslo'
CELERY_ENABLE_UTC = True
from celery.schedules import crontab
CELERYBEAT_SCHEDULE = {
'every-minute': {
'task': 'tasks.remote',
'schedule': timedelta(seconds=30),
'args': (),
},
}
这可能吗?怎么样?
谢谢!
答案 0 :(得分:8)
amqp 后端为每项任务创建一个新队列。或者,有一个新的 rpc 后端,可以将结果保存在一个队列中。
http://docs.celeryproject.org/en/master/whatsnew-3.1.html#new-rpc-result-backend
答案 1 :(得分:5)
没什么不寻常的。
当我们使用amqp作为结果后端时,这就是celery的工作原理。它将为与工作者消耗的每个任务相对应的每个结果创建一个新的临时队列。
如果您对结果不感兴趣,可以尝试CELERY_IGNORE_RESULT = True setting
如果您确实要存储结果,那么我建议您使用与Redis不同的结果后端。
答案 2 :(得分:2)
你说你希望Celery将结果保存在一个队列中。现在,回答你的问题,让我问你一个问题:
您如何期望每个制作人在没有阅读队列中的每条消息的情况下检查相关结果以找到它需要/想要的消息?
本质上,你想要的是一个键值对数据库,这样查找就是O(1)。使用队列代理执行此操作的唯一方法是为每个"对#34建立一个队列。
我知道有很多GUID队列并不整洁或漂亮,但它在概念上是在消息传递代理上执行此操作的唯一方法。
答案 3 :(得分:0)
此解决方案不会将所有结果保留在一个队列中,但是当您完成这些任务时,它至少会清理额外的队列。
如果您使用Redis作为后端,当您完成创建了错误队列的结果时,请运行result.forget()。这将导致结果的结果和队列消失。这可以帮助您管理您拥有的队列数量,并防止OOM问题。