在文档上我读到了这个:
这是一个简单的链,第一个任务执行将其返回值传递给链中的下一个任务,依此类推。
>>> from celery import chain
>>> # 2 + 2 + 4 + 8
>>> res = chain(add.s(2, 2), add.s(4), add.s(8))()
>>> res.get()
16
但链条项目的确切结果是否传递给下一个连锁项目?在芹菜服务器端,或者它传递给我的应用程序然后我的应用程序将它传递给下一个链项?
这对我很重要,因为我的结果很大,无法将它们传递到应用程序,我希望将所有这些消息传递到芹菜服务器。
>>> g = group(add.s(i) for i in xrange(10))
>>> g(10).get()
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
我可以确定这些任务将尽可能一起执行。自从该小组的第一项任务开始执行以来,芹菜会优先考虑某个群体吗?
例如,我有100个请求,每个请求都运行任务组,我不想将来自不同组的任务混合在一起。首先启动的处理请求可以是最后完成的,而他的最后一个任务是等待忙于处理来自其他请求的任务的自由工作者。如果任务组将尽可能一起执行似乎会更好。
如果你能帮助我,我将非常感激。
答案 0 :(得分:1)
<强> 1。芹菜链
使用诸如rabbitmq之类的消息传递代理在芹菜方传递结果。使用结果后端存储结果(和弦执行明确需要)。您可以通过使用loglevel 'INFO'
运行芹菜工作者来验证此信息,并确定如何调用任务。
Celery在您调用任务后会维护dependency graph,因此它完全知道如何链接您的任务。
考虑连接两个不同任务的回调,
http://docs.celeryproject.org/en/latest/userguide/canvas.html#callbacks
<强> 2。芹菜集团
当您在组中调用任务时,芹菜并行执行(调用)它们。芹菜工人将尝试根据它可以提取的工作量来接收它们。如果你调用的工作数量大于你的工人可以处理的数量,那么你的前几个任务肯定可以先执行,然后芹菜工人会逐渐休息。
如果你有非常大的没有。并行调用的任务更好地调用然后在某个池大小的chunks中调用
您可以提及answer
中提到的任务优先级组中任务的完成取决于每项任务花费的时间。 Celery尽可能地尝试公平的任务安排。