def _set_function_node_output(self, node_id, node_attr, no_call,
                                  next_nds=None, **kw):
        o_nds, dist = node_attr['outputs'], self.dist
        output_nodes = next_nds or set(self._succ[node_id]).difference(dist)
        if not output_nodes:
            self.workflow.remove_node(node_id)
            return False
        wf_add_edge = self._wf_add_edge
        if no_call:
            for u in output_nodes:
                wf_add_edge(node_id, u)
            return True
        args = self._wf_pred[node_id]
        args = [args[k]['value'] for k in node_attr['inputs']]
        try:
            self._check_function_domain(args, node_attr, node_id)
            res = async_thread(self, args, node_attr, node_id, **kw)
            self.workflow.node[node_id]['results'] = res
        except SkipNode:
            return False
        for k, v in zip(o_nds, res if len(o_nds) > 1 else [res]):
            if k in output_nodes and v is not NONE:
                wf_add_edge(node_id, k, value=v)
        return True