code: def join(self, end_comps=False):
          
          for name, child in self._compound_children.items():
              if end_comps and not child.is_pipe_end():
                  continue
              self.logger.debug('join %s (%s)', name, child.__class__.__name__)
              child.join()
docs: Wait for the compound component's children to stop running.
  
          :param bool end_comps: only wait for the components that end a
              pipeline. This is useful for complex graphs where it is
              normal for some components not to terminate.