是否有任何区别:差获得,并加入
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()
芹菜文档使用这两个例子中,我看不出有什么差别。
是否有任何区别:差获得,并加入
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()
芹菜文档使用这两个例子中,我看不出有什么差别。
区别在于组与和弦的区别。问题是如果你想要所有任务的结果,或者如果你想要一个任务来处理结果。
组用于启动几个任务,然后按照它们被调用的顺序加入结果。
>>> 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
简短的回答
虽然get
和join
方式,一种是group
应该返回相同的结果,get
实现了一些缓存,可能会根据您使用的后端更高效。除非您确实需要使用join
来处理某些边缘情况,否则您应该使用get
。
龙答案
这里是芹菜的ResultSet
类的get
方法将GroupResult
类扩展源。
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
方法的文档字符串是这样说的。
这可以是结果存储后端必须 诉诸轮询(例如,数据库)是昂贵的操作。如果您的后端支持,则应考虑使用
join_native
。
所以,你应该被调用join_native
而不是join
如果你的后台支持它。但为什么要打扰有条件地打电话给其中一方,如果get
为你包装了这个逻辑?改用get
。
您可以使用获取或加入一个组,这不是正确的答案 – bwawok