Skip to content

Commit

Permalink
bpo-31234: threading_cleanup() now warns immediately (#3138)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
vstinner committed Sep 13, 2017
1 parent 88031a9 commit ace1ecc
Showing 1 changed file with 19 additions and 9 deletions.
28 changes: 19 additions & 9 deletions Lib/test/support/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit ace1ecc

Please sign in to comment.