docs: def run(self, test: unittest.TestSuite):
          """
          Given a TestSuite, will create one process per test case whenever possible and run them concurrently.
          Will then wait for the result and return them
  
          :param test: the TestSuite to run
          :return: a summary of the test run
          """
          start_time = time.time()
          process = []
          resource_manager = multiprocessing.Manager()
          results_queue = resource_manager.Queue()
          tasks_running = resource_manager.BoundedSemaphore(self.process_number)
  
          test_suites, local_test_suites = self.collect_tests(test)
  
          results_collector = ResultCollector(
              self.stream, self.descriptions, self.verbosity,
              result_queue=results_queue, test_results=self._makeResult(),
              tests=test_suites
          )
  
          results_collector.start()
  
          for index, suite in enumerate(test_suites):
              tasks_running.acquire()
              x = self.Process(index, suite, results_queue, tasks_running)
              x.start()
              process.append(x)
  
          local_test_suites.run(results_collector)
  
          for i in process:
              i.join()
  
          results_queue.join()
          results_collector.end_collection()
          results_collector.join()
  
          results_collector.printErrors()
          self.print_summary(results_collector, time.time() - start_time)
  
          return results_collector