Celery源码阅读 result

一、ResultBase

Result基类,parent用于某个任务是一条任务链中的子任务时标记父任务。

class ResultBase:
    """Base class for results."""

    #: Parent result (if part of a chain)
    parent = None

二、AsyncResult

继承自ResultBase的Result类,task默认使用AsyncResult作为结果类。

1. 属性


def __init__(self, id, backend=None,
                 task_name=None,            # deprecated
                 app=None, parent=None):
        if id is None:
            raise ValueError(
                f'AsyncResult requires valid id, not {type(id)}')
        self.app = app_or_default(app or self.app)
        self.id = id
        self.backend = backend or self.app.backend
        self.parent = parent
        self.on_ready = promise(self._on_fulfilled, weak=True)
        self._cache = None
        self._ignored = False
  • app:app,若未指定则使用默认app。
  • id:result对应的task的id。
  • backend:结果后端,未指定则使用app绑定的结果后端。
  • parent:父任务对应的Result对象。
  • on_ready:
  • _cache:用于保存result对应的元任务。
  • _ignored:若为Ture则忽略任务结果。

2. property

  • ignored,对应_ignored,若为True忽略任务结果。
@property
def ignored(self):
    """If True, task result retrieval is disabled."""
    if hasattr(self, '_ignored'):
        return self._ignored
    return False

@ignored.setter
def ignored(self, value):
    """Enable/disable task result retrieval."""
    self._ignored = value

        观察get函数,可以发现当ignored为True时直接返回。

def get(self, timeout=None, propagate=True, interval=0.5,
            no_ack=True, follow_parents=True, callback=None, on_message=None,
            on_interval=None, disable_sync_subtasks=True,
            EXCEPTION_STATES=states.EXCEPTION_STATES,
            PROPAGATE_STATES=states.PROPAGATE_STATES):
    
    if self.ignored:
        return
    ....
  • graph,返回以当前节点为根的有向无环子图。
@cached_property
def graph(self):
    return self.build_graph()

        查看build_graph方法:

def build_graph(self, intermediate=False, formatter=None):
    graph = DependencyGraph(
        formatter=formatter or GraphFormatter(root=self.id, shape='oval'),
    )
    for parent, node in self.iterdeps(intermediate=intermediate):
        graph.add_arc(node)
        if parent:
            graph.add_edge(parent, node)
    return graph

       build_graph生成了一个DependencyGraph,DependencyGraph是一个有向无环图,通过拓扑排序确定任务的处理顺序。graph的根是当前result节点,通过iterdeps遍历图,最终生成以当前节点为根的子图。

       查看iterdeps方法:

def iterdeps(self, intermediate=False):
    stack = deque([(None, self)])

    while stack:
        parent, node = stack.popleft()
        yield parent, node
        if node.ready():
            stack.extend((node, child) for child in node.children or [])
        else:
            if not intermediate:
                raise IncompleteStream()

         iterdeps通过层次遍历的方式遍历以当前result 节点为根的result子图。生成器中的每一项是当前节点和当前节点的父节点组成的元组。

  • supports_native_join,结果后端是否支持本地联接。
@property
def supports_native_join(self):
    return self.backend.supports_native_join
  • children,返回当前任务的子任务。
@property
def children(self):
    return self._get_task_meta().get('children')

def _get_task_meta(self):
    if self._cache is None:
        return self._maybe_set_cache(self.backend.get_task_meta(self.id))
    return self._cache

def _maybe_set_cache(self, meta):
    if meta:
        state = meta['status']
        if state in states.READY_STATES:
            d = self._set_cache(self.backend.meta_from_decoded(meta))
            self.on_ready(self)
            return d
    return meta

def _get_task_meta(self):
    if self._cache is None:
        return self._maybe_set_cache(self.backend.get_task_meta(self.id))
    return self._cache

def _set_cache(self, d):
    children = d.get('children')
    if children:
        d['children'] = [
            result_from_tuple(child, self.app) for child in children
        ]
    self._cache = d
    return d

        _get_task_meta方法首先检查是否设置了缓存,如果没有设置则调用结果后端通过task id获取task,并通过_maybe_set_cache将任务进行缓存。_set_cache调用result_from_tuple()通过当前任务的子任务获取到子任务对应的AsyncResult对象或者GroupResult对象。

三、ResultSet(后续更新)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值