diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2016-03-23 01:04:32 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2016-03-23 01:04:32 (GMT) |
commit | 6d7f4f6675b683475a8eaa8f0f5dff35a0b165f7 (patch) | |
tree | 18291fcad9e4b22ca6e27fd5a2ae90aa1e16a89f | |
parent | e98445a4deb2b2eb97de26e03fc8c4c2a5f256d4 (diff) | |
download | cpython-6d7f4f6675b683475a8eaa8f0f5dff35a0b165f7.zip cpython-6d7f4f6675b683475a8eaa8f0f5dff35a0b165f7.tar.gz cpython-6d7f4f6675b683475a8eaa8f0f5dff35a0b165f7.tar.bz2 |
regrtest: add timeout to main process when using -jN
libregrtest: add a watchdog to run_tests_multiprocess() using
faulthandler.dump_traceback_later().
-rw-r--r-- | Lib/test/libregrtest/runtest_mp.py | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index 0ca7dd7..5e847a0 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -1,3 +1,4 @@ +import faulthandler import json import os import queue @@ -151,6 +152,8 @@ class MultiprocessThread(threading.Thread): def run_tests_multiprocess(regrtest): output = queue.Queue() pending = MultiprocessIterator(regrtest.tests) + test_timeout = regrtest.ns.timeout + use_timeout = (test_timeout is not None) workers = [MultiprocessThread(pending, output, regrtest.ns) for i in range(regrtest.ns.use_mp)] @@ -170,11 +173,14 @@ def run_tests_multiprocess(regrtest): finished = 0 test_index = 1 - timeout = max(PROGRESS_UPDATE, PROGRESS_MIN_TIME) + get_timeout = max(PROGRESS_UPDATE, PROGRESS_MIN_TIME) try: while finished < regrtest.ns.use_mp: + if use_timeout: + faulthandler.dump_traceback_later(test_timeout, exit=True) + try: - item = output.get(timeout=timeout) + item = output.get(timeout=get_timeout) except queue.Empty: running = get_running(workers) if running and not regrtest.ns.pgo: @@ -215,6 +221,9 @@ def run_tests_multiprocess(regrtest): regrtest.interrupted = True pending.interrupted = True print() + finally: + if use_timeout: + faulthandler.cancel_dump_traceback_later() running = [worker.current_test for worker in workers] running = list(filter(bool, running)) |