]> granicus.if.org Git - python/commitdiff
bpo-31234: threading_cleanup() now warns immediately (#3138)
authorVictor Stinner <victor.stinner@gmail.com>
Wed, 13 Sep 2017 20:42:00 +0000 (13:42 -0700)
committerGitHub <noreply@github.com>
Wed, 13 Sep 2017 20:42:00 +0000 (13:42 -0700)
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

index f57b25177920aa083535218d6d2bdab5f590316c..df235050ae2c7cef4b56e0c0f68d8310f178afba 100644 (file)
@@ -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