          logger.debug("Thread error caught: %s", self.errors)
          error = self.errors[0]
          raise error[1].with_traceback(error[2])
  
      def is_alive(self):
          """ Return true if any thread is alive else false """
          return any(thread.is_alive() for thread in self._threads)
  
      def start(self):
          """ Start a thread with the given method and args """
          logger.debug("Starting thread(s): '%s'", self._name)
 
</s> remove     def start(self):
        """ Start a thread with the given method and args """
 </s> add     def start(self) -> None:
        """ Start all the threads for the given method, args and kwargs """ </s> remove             name = "{}_{}".format(self._name, idx)
 </s> add             name = self._name if self._thread_count == 1 else f"{self._name}_{idx}" </s> remove     def check_and_raise_error(self):
        """ Checks for errors in thread and raises them in caller """
 </s> add     def check_and_raise_error(self) -> None:
        """ Checks for errors in thread and raises them in caller.

        Raises
        ------
        Error
            Re-raised error from within the thread
        """ </s> remove     def errors(self):
        """ Return a list of thread errors """
 </s> add     def errors(self) -> List[_ErrorType]:
        """ list: List of thread error values """
    def is_alive(self) -> bool:
        """ Check if any threads are still alive

        Returns
        -------
        bool
            ``True`` if any threads are alive. ``False`` if no threads are alive
        """
          logger.debug("Thread error caught: %s", self.errors)
          error = self.errors[0]
          raise error[1].with_traceback(error[2])
  
    def is_alive(self) -> bool:
        """ Check if any threads are still alive

        Returns
        -------
        bool
            ``True`` if any threads are alive. ``False`` if no threads are alive
        """
    def is_alive(self) -> bool:
        """ Check if any threads are still alive

        Returns
        -------
        bool
            ``True`` if any threads are alive. ``False`` if no threads are alive
        """
          return any(thread.is_alive() for thread in self._threads)
  
      def start(self):
          """ Start a thread with the given method and args """
          logger.debug("Starting thread(s): '%s'", self._name)
keep keep keep keep replace replace keep keep keep keep keep
 bugfix - timelapse image loader
multithreading.py - typing + docs 
lib/multithreading.py