之间有什么区别:
r = group(some_task.s(i) for i in range(10)).apply_async()
result = r.join()
和
r = group(some_task.s(i) for i in range(10))()
result = r.get()
Celery文档使用了两个示例,但我没有看到任何差异。
答案 0 :(得分:6)
简短回答
虽然get
的{{1}}和join
方法应返回相同的结果,但group
会实现一些缓存,并且可能会更高效,具体取决于您的后端重新使用。除非您确实需要使用get
来表示某些边缘情况,否则应使用join
。
答案很长
以下是get
类扩展的芹菜get
类的ResultSet
方法的来源。
GroupResult
我们首先看到的是docstring告诉我们要查看文档的def get(self, timeout=None, propagate=True, interval=0.5,
callback=None, no_ack=True, on_message=None):
"""See :meth:`join`
This is here for API compatibility with :class:`AsyncResult`,
in addition it uses :meth:`join_native` if available for the
current result backend.
"""
if self._cache is not None:
return self._cache
return (self.join_native if self.supports_native_join else self.join)(
timeout=timeout, propagate=propagate,
interval=interval, callback=callback, no_ack=no_ack,
on_message=on_message,
)
方法。马上,这表明这些方法非常相似。
查看join
方法的主体,我们可以看到它首先检查缓存的值并返回它(如果已设置)。如果未找到缓存值,get
将调用get
或join
方法,具体取决于后端是否支持本机连接。如果您发现join_native
语句的格式有点令人困惑,那么这基本上是相同的:
return
if self.supports_native_join:
return self.join_native(timeout=timeout,
propagate=propagate,
interval=interval,
callback=callback,
no_ack=no_ack,
on_message=on_message)
else:
return self.join(timeout=timeout,
propagate=propagate,
interval=interval,
callback=callback,
no_ack=no_ack,
on_message=on_message)
方法的文档字符串可以这么说。
对于必须的结果存储后端,这可能是一项昂贵的操作 诉诸民意调查(例如数据库)。你应该考虑使用
join
如果您的后端支持它。
因此,如果您的后端支持, 应该<{1}}而不是join_native
。但是,如果join_native
为你包装这个逻辑,为什么还要有条件地调用一个或另一个呢?只需使用join
代替。
答案 1 :(得分:1)
区别在于组和和弦之间的差异。问题是你是否想要所有任务的结果,或者你是否想要一个对结果做某事的任务。
群组用于启动多个任务,然后按照调用的顺序加入结果。
>>> job = group([
... add.subtask((2, 2)),
... add.subtask((4, 4)),
... add.subtask((8, 8)),
... add.subtask((16, 16)),
... add.subtask((32, 32)),
... ])
>>> result = job.apply_async()
>>> result.join()
[4, 8, 16, 32, 64]
和弦是您希望在完成所有指定任务后执行的任务。
>>> callback = last_task.subtask()
>>> tasks = [task.subtask(...) ... ]
>>> result = chord(tasks)(callback)
>>> result.get()
<output from last_task which have access to the results from the tasks>
您可以在此处详细了解这些内容:http://ask.github.io/celery/userguide/tasksets.html