(self, num_workers: int, runtests: RunTests,
logger: Logger, results: TestResults)
| 470 | |
| 471 | class RunWorkers: |
| 472 | def __init__(self, num_workers: int, runtests: RunTests, |
| 473 | logger: Logger, results: TestResults) -> None: |
| 474 | self.num_workers = num_workers |
| 475 | self.runtests = runtests |
| 476 | self.log = logger.log |
| 477 | self.display_progress = logger.display_progress |
| 478 | self.results: TestResults = results |
| 479 | self.live_worker_count = 0 |
| 480 | |
| 481 | self.output: queue.Queue[QueueContent] = queue.Queue() |
| 482 | tests_iter = runtests.iter_tests() |
| 483 | self.pending = MultiprocessIterator(tests_iter) |
| 484 | self.timeout = runtests.timeout |
| 485 | if self.timeout is not None: |
| 486 | # Rely on faulthandler to kill a worker process. This timouet is |
| 487 | # when faulthandler fails to kill a worker process. Give a maximum |
| 488 | # of 5 minutes to faulthandler to kill the worker. |
| 489 | self.worker_timeout: float | None = min(self.timeout * 1.5, self.timeout + 5 * 60) |
| 490 | else: |
| 491 | self.worker_timeout = None |
| 492 | self.workers: list[WorkerThread] = [] |
| 493 | |
| 494 | jobs = self.runtests.get_jobs() |
| 495 | if jobs is not None: |
| 496 | # Don't spawn more threads than the number of jobs: |
| 497 | # these worker threads would never get anything to do. |
| 498 | self.num_workers = min(self.num_workers, jobs) |
| 499 | |
| 500 | def start_workers(self) -> None: |
| 501 | self.workers = [WorkerThread(index, self) |
no test coverage detected