Browse Source

bpo-46205: exit if no workers are alive in runtest_mp (GH-30470)

(cherry picked from commit e13cdca0f5)

Co-authored-by: Sam Gross <colesbury@gmail.com>
pull/30526/head
Miss Islington (bot) 4 years ago
committed by GitHub
parent
commit
e0ec08dc49
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 18
      Lib/test/libregrtest/runtest_mp.py
  2. 1
      Misc/NEWS.d/next/Tests/2022-01-07-14-06-12.bpo-46205.dnc2OC.rst

18
Lib/test/libregrtest/runtest_mp.py

@ -395,16 +395,12 @@ class MultiprocessTestRunner:
worker.wait_stopped(start_time)
def _get_result(self) -> QueueOutput | None:
if not any(worker.is_alive() for worker in self.workers):
# all worker threads are done: consume pending results
try:
return self.output.get(timeout=0)
except queue.Empty:
return None
use_faulthandler = (self.ns.timeout is not None)
timeout = PROGRESS_UPDATE
while True:
# bpo-46205: check the status of workers every iteration to avoid
# waiting forever on an empty queue.
while any(worker.is_alive() for worker in self.workers):
if use_faulthandler:
faulthandler.dump_traceback_later(MAIN_PROCESS_TIMEOUT,
exit=True)
@ -420,6 +416,12 @@ class MultiprocessTestRunner:
if running and not self.ns.pgo:
self.log('running: %s' % ', '.join(running))
# all worker threads are done: consume pending results
try:
return self.output.get(timeout=0)
except queue.Empty:
return None
def display_result(self, mp_result: MultiprocessResult) -> None:
result = mp_result.result

1
Misc/NEWS.d/next/Tests/2022-01-07-14-06-12.bpo-46205.dnc2OC.rst

@ -0,0 +1 @@
Fix hang in runtest_mp due to race condition
Loading…
Cancel
Save