def _init_futures(self): """Build futures for results and output; hook up callbacks""" if not self._children: for msg_id in self.msg_ids: future = self._client._futures.get(msg_id, None) if not future: result = self._client.results.get(msg_id, _default) # result resides in local cache, construct already-resolved Future if result is not _default: future = Future() future.msg_id = msg_id future.output = Future() future.output.metadata = self.client.metadata[msg_id] future.set_result(result) future.output.set_result(None) if not future: raise KeyError("No Future or result for msg_id: %s" % msg_id) self._children.append(future) self._result_future = multi_future(self._children) self._output_future = multi_future([self._result_future] + [ f.output for f in self._children ]) # on completion of my constituents, trigger my own resolution self._result_future.add_done_callback(self._resolve_result) self._output_future.add_done_callback(self._resolve_output)