code: def start(self, datas):
          
          if not self._started.isSet() and \
             not self._running.isSet() and \
             not self._pausing.isSet():
              # Plumber statistics
              self.stats = {}
              self.stats['start_time'] = None
              self.stats['run_time'] = None
              # connects input pipers to external data
              self.connect_inputs(datas)
              # connects pipers within the pipeline
              self.connect()
              # make pointers to results collected for pipers by imaps
              self.stats['pipers_tracked'] = {}
              for piper in self.postorder():
                  if hasattr(piper.imap, '_tasks_tracked') and piper.track:
                      self.stats['pipers_tracked'][piper] = \
                      [piper.imap._tasks_tracked[t.task] for t in piper.imap_tasks]
  
              self.stats['start_time'] = time()
              # starts the Dagger
              # this starts Pipers and NuMaps
              super(Plumber, self).start()
              # transitioning to started state
              self._started.set()
              self._finished.clear()
          else:
              raise PlumberError
docs: Starts the pipeline by connecting the input ``Pipers`` of the pipeline 
          to the input data, connecting the pipeline and starting the ``NuMap``
          instances.
          
          The order of items in the "datas" argument sequence should correspond 
          to the order of the input ``Pipers`` defined by ``Dagger._cmp`` and 
          ``Piper.ornament``.
  
          Arguments:
          
            - datas(sequence) A sequence of external input data in the form of 
              sequences or iterators.