]> granicus.if.org Git - python/commitdiff
bpo-30845: Enhance test_concurrent_futures cleanup (#2564)
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 4 Jul 2017 11:14:04 +0000 (13:14 +0200)
committerGitHub <noreply@github.com>
Tue, 4 Jul 2017 11:14:04 +0000 (13:14 +0200)
* bpo-30845: reap_children() now logs warnings

* bpo-30845: Enhance test_concurrent_futures cleanup

In setUp() and tearDown() methods of test_concurrent_futures tests,
make sure that tests don't leak threads nor processes. Clear
explicitly the reference to the executor to make it that it's
destroyed (to prevent "dangling threads" warning).

Lib/test/support/__init__.py
Lib/test/test_concurrent_futures.py

index 3cfa487ba96a4ce6ce1eb7b78e98f0f078c20591..313c23004ed79780ad6d8da081d2f08efb8c0a3e 100644 (file)
@@ -2079,7 +2079,6 @@ def reap_children():
     stick around to hog resources and create problems when looking
     for refleaks.
     """
-
     # Reap all our dead child processes so we don't leave zombies around.
     # These hog resources and might be causing some of the buildbots to die.
     if hasattr(os, 'waitpid'):
@@ -2090,6 +2089,8 @@ def reap_children():
                 pid, status = os.waitpid(any_process, os.WNOHANG)
                 if pid == 0:
                     break
+                print("Warning -- reap_children() reaped child process %s"
+                      % pid, file=sys.stderr)
             except:
                 break
 
index e2da47bc5828de9238652b03493d3837609fc77d..c649555f39c26b8747ee1a3d98fc1c7d68c841c4 100644 (file)
@@ -63,6 +63,8 @@ class ExecutorMixin:
     worker_count = 5
 
     def setUp(self):
+        self._thread_cleanup = test.support.threading_setup()
+
         self.t1 = time.time()
         try:
             self.executor = self.executor_type(max_workers=self.worker_count)
@@ -72,11 +74,16 @@ class ExecutorMixin:
 
     def tearDown(self):
         self.executor.shutdown(wait=True)
+        self.executor = None
+
         dt = time.time() - self.t1
         if test.support.verbose:
             print("%.2fs" % dt, end=' ')
         self.assertLess(dt, 60, "synchronization issue: test lasted too long")
 
+        test.support.threading_cleanup(*self._thread_cleanup)
+        test.support.reap_children()
+
     def _prime_executor(self):
         # Make sure that the executor is ready to do work before running the
         # tests. This should reduce the probability of timeouts in the tests.