From ace1ecc00b35a8b1dc6e352d547dde07913017bb Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 13 Sep 2017 13:42:00 -0700 Subject: [PATCH] bpo-31234: threading_cleanup() now warns immediately (#3138) support.threading_cleanup() waits for 1 second before emitting a warning if there are threads running in the background. With this change, it now emits the warning immediately, to be able to catch bugs more easily. --- Lib/test/support/__init__.py | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index f57b251779..df235050ae 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -2030,22 +2030,32 @@ def threading_cleanup(*original_values): global environment_altered _MAX_COUNT = 100 - t0 = time.monotonic() + for count in range(_MAX_COUNT): values = _thread._count(), threading._dangling if values == original_values: break + + if not count: + # Display a warning at the first iteration + environment_altered = True + dangling_threads = values[1] + print("Warning -- threading_cleanup() failed to cleanup " + "%s threads (count: %s, dangling: %s)" + % (values[0] - original_values[0], + values[0], len(dangling_threads)), + file=sys.stderr) + for thread in dangling_threads: + print(f"Dangling thread: {thread!r}", file=sys.stderr) + sys.stderr.flush() + + # Don't hold references to threads + dangling_threads = None + values = None + time.sleep(0.01) gc_collect() - else: - environment_altered = True - dt = time.monotonic() - t0 - print("Warning -- threading_cleanup() failed to cleanup %s threads " - "after %.0f sec (count: %s, dangling: %s)" - % (values[0] - original_values[0], dt, - values[0], len(values[1])), - file=sys.stderr) def reap_threads(func): """Use this function when threads are being used. This will -- 2.40.0