]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-38546: multiprocessing tests stop the resource tracker (GH-17641) (GH-17647)
authorVictor Stinner <vstinner@python.org>
Wed, 18 Dec 2019 09:11:05 +0000 (10:11 +0100)
committerGitHub <noreply@github.com>
Wed, 18 Dec 2019 09:11:05 +0000 (10:11 +0100)
Multiprocessing and concurrent.futures tests now stop the resource
tracker process when tests complete.

Add ResourceTracker._stop() method to
multiprocessing.resource_tracker.

Add _cleanup_tests() helper function to multiprocessing.util: share
code between multiprocessing and concurrent.futures tests.

(cherry picked from commit 9707e8e22d80ca97bf7a9812816701cecde6d226)

Lib/multiprocessing/resource_tracker.py
Lib/multiprocessing/util.py
Lib/test/_test_multiprocessing.py
Lib/test/test_concurrent_futures.py
Misc/NEWS.d/next/Tests/2019-12-17-15-27-07.bpo-38546.82JwN2.rst [new file with mode: 0644]

index 61a6dd66e72e67ec433218a1755175ebae7f4656..c9bfa9b82b6e6c9c5ef2eebd1cbe02fc7111961b 100644 (file)
@@ -50,6 +50,19 @@ class ResourceTracker(object):
         self._fd = None
         self._pid = None
 
+    def _stop(self):
+        with self._lock:
+            if self._fd is None:
+                # not running
+                return
+
+            # closing the "alive" file descriptor stops main()
+            os.close(self._fd)
+            self._fd = None
+
+            os.waitpid(self._pid, 0)
+            self._pid = None
+
     def getfd(self):
         self.ensure_running()
         return self._fd
index 32b51b04373f91c00a03b28e11f663918d61deee..745f2b2651b11fbea8ec86d1d47bb32c24e697c4 100644 (file)
@@ -439,3 +439,28 @@ def close_fds(*fds):
     """Close each file descriptor given as an argument"""
     for fd in fds:
         os.close(fd)
+
+
+def _cleanup_tests():
+    """Cleanup multiprocessing resources when multiprocessing tests
+    completed."""
+
+    from test import support
+
+    # cleanup multiprocessing
+    process._cleanup()
+
+    # Stop the ForkServer process if it's running
+    from multiprocessing import forkserver
+    forkserver._forkserver._stop()
+
+    # Stop the ResourceTracker process if it's running
+    from multiprocessing import resource_tracker
+    resource_tracker._resource_tracker._stop()
+
+    # bpo-37421: Explicitly call _run_finalizers() to remove immediately
+    # temporary directories created by multiprocessing.util.get_temp_dir().
+    _run_finalizers()
+    support.gc_collect()
+
+    support.reap_children()
index b7f3d253c4d131b20fae2f3e395c33c2ea762473..983770f35761d0048eac697d76dcda96d733477a 100644 (file)
@@ -5673,16 +5673,7 @@ def install_tests_in_module_dict(remote_globs, start_method):
         if need_sleep:
             time.sleep(0.5)
 
-        multiprocessing.process._cleanup()
-
-        # Stop the ForkServer process if it's running
-        from multiprocessing import forkserver
-        forkserver._forkserver._stop()
-
-        # bpo-37421: Explicitly call _run_finalizers() to remove immediately
-        # temporary directories created by multiprocessing.util.get_temp_dir().
-        multiprocessing.util._run_finalizers()
-        test.support.gc_collect()
+        multiprocessing.util._cleanup_tests()
 
     remote_globs['setUpModule'] = setUpModule
     remote_globs['tearDownModule'] = tearDownModule
index 98c9bc9b507a47addf230485c0ae1d27fc56e6ab..e01f2e4b78759e24650cbaedb1d66918bbaf86f7 100644 (file)
@@ -1306,17 +1306,7 @@ def setUpModule():
 
 def tearDownModule():
     test.support.threading_cleanup(*_threads_key)
-    test.support.reap_children()
-
-    # cleanup multiprocessing
-    multiprocessing.process._cleanup()
-    # Stop the ForkServer process if it's running
-    from multiprocessing import forkserver
-    forkserver._forkserver._stop()
-    # bpo-37421: Explicitly call _run_finalizers() to remove immediately
-    # temporary directories created by multiprocessing.util.get_temp_dir().
-    multiprocessing.util._run_finalizers()
-    test.support.gc_collect()
+    multiprocessing.util._cleanup_tests()
 
 
 if __name__ == "__main__":
diff --git a/Misc/NEWS.d/next/Tests/2019-12-17-15-27-07.bpo-38546.82JwN2.rst b/Misc/NEWS.d/next/Tests/2019-12-17-15-27-07.bpo-38546.82JwN2.rst
new file mode 100644 (file)
index 0000000..78d9df3
--- /dev/null
@@ -0,0 +1,2 @@
+Multiprocessing and concurrent.futures tests now stop the resource tracker
+process when tests complete.