听起来您好像希望一条消息被两个队列触发/消耗,但这不是Celery的工作方式。Exchange会将任务发布到符合条件的队列中,但是一旦使用完毕,其他队列将忽略该消息。对于每个要触发的任务,您都需要一条消息。
新来的Celery用户经常会感到困惑,因为此系统中有两个“队列”用途;Queue()和文档所引用的Kombu队列,以及AMQP队列,它们直接保存消息并由工作人员使用。当我们发布到队列时,我们会想到AMQP队列,这是不正确的。(感谢回答链接在下面)。
回到您的问题,如果我理解正确的话,当user_created被消耗掉时,您希望它又产生两个任务:send_user_activate_email和check_spam。此外,它们不应该相互依赖。它们可以在单独的计算机上并行运行,而无需知道彼此的状态。
在这种情况下,您希望user_created可以“
apply_async”这两个新任务并返回。这可以直接完成,也可以使用包含check_spam和send_user_activate_email的Celery“组”来实现。该小组提供了一些不错的速记,并为您的任务提供了一些结构,因此我个人会向您介绍这个方向。
#pseudopregroup(check_spam.s(... checkspam kwargs ...), send_user_activate_email.s(... active email kwargs ...)).apply_async()
此设置将创建四个消息。每个要执行的任务一个,再加上Group()一个,它本身将产生一个结果。
对于您而言,我不确定是否需要使用Exchange或ignore_result,但是我需要查看Task代码并进一步了解系统才能做出判断。
http://docs.celeryproject.org/en/latest/userguide/canvas.html#groups
http://celery.readthedocs.org/en/v2.2.6/userguide/routing.html#exchanges-
queues-and-routing
-keys 为什么CELERY_ROUTES同时具有“队列”和“
routing_key”?
(如果我离开的话,我将删除/删除答案…)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)