芹菜获得和加入之间的区别

时间:2015-10-18 14:22:42

标签: python celery

之间有什么区别:

 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文档使用了两个示例,但我没有看到任何差异。

2 个答案:

答案 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将调用getjoin方法,具体取决于后端是否支持本机连接。如果您发现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