]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-30845: Enhance test_concurrent_futures cleanup (#2564) (#2880)
authorVictor Stinner <victor.stinner@gmail.com>
Wed, 26 Jul 2017 03:05:09 +0000 (05:05 +0200)
committerGitHub <noreply@github.com>
Wed, 26 Jul 2017 03:05:09 +0000 (05:05 +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).

(cherry picked from commit 3df9dec425b0254df1cdf41922fd8d6b08bf47e4)

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

index 677743bb3898027823e8f1bdad5a3d6acd8ba6ed..a5b8c46f9495b06eb23c0cad5bad9742b207b7bc 100644 (file)
@@ -2053,7 +2053,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'):
@@ -2064,6 +2063,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 23e95b212447c866a0ec7d282b58cd416d5e60a9..92a3ebdd886c126ed21756d708d4bf7353c5ba7f 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.