code: def start(self, nb_threads: int) -> None:
          
          if self._active_threads:
              raise Exception('Threads already started.')
  
          # Create thread pool
          for _ in range(nb_threads):
              worker = threading.Thread(
                  target=_work_function,
                  args=(self._job_q, self._result_q, self._error_q))
              worker.start()
              self._thread_list.append(worker)
              self._active_threads += 1
  
          # Put sentinels to let the threads know when there's no more jobs
          for _ in self._thread_list:
              self._job_q.put(_ThreadPoolSentinel())
docs: Should only be called once all the jobs have been added using add_job().