code: 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