summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2019-07-05 14:35:38 (GMT)
committerGitHub <noreply@github.com>2019-07-05 14:35:38 (GMT)
commit229f6e85f8b4d57a2e742e0d3fc361c5bd15f1cb (patch)
tree7eba2ca1822b74f9a9fb0bb21cfcfdbbd4e3bfe3
parentb4cd6ba1a028c2624ac7bc93439b9d45f51cfeba (diff)
downloadcpython-229f6e85f8b4d57a2e742e0d3fc361c5bd15f1cb.zip
cpython-229f6e85f8b4d57a2e742e0d3fc361c5bd15f1cb.tar.gz
cpython-229f6e85f8b4d57a2e742e0d3fc361c5bd15f1cb.tar.bz2
bpo-37421: multiprocessing tests now stop ForkServer (GH-14601)
multiprocessing tests now stop the ForkServer instance if it's running: close the "alive" file descriptor to ask the server to stop and then remove its UNIX address. (cherry picked from commit 8fbeb14312b4c1320d31ad86e69749515879d1c3) Co-authored-by: Victor Stinner <vstinner@redhat.com>
-rw-r--r--Lib/multiprocessing/forkserver.py19
-rw-r--r--Lib/test/_test_multiprocessing.py6
-rw-r--r--Misc/NEWS.d/next/Tests/2019-07-05-14-47-55.bpo-37421.n8o2to.rst3
3 files changed, 28 insertions, 0 deletions
diff --git a/Lib/multiprocessing/forkserver.py b/Lib/multiprocessing/forkserver.py
index 9b63986..87ebef6 100644
--- a/Lib/multiprocessing/forkserver.py
+++ b/Lib/multiprocessing/forkserver.py
@@ -39,6 +39,25 @@ class ForkServer(object):
self._lock = threading.Lock()
self._preload_modules = ['__main__']
+ def _stop(self):
+ # Method used by unit tests to stop the server
+ with self._lock:
+ self._stop_unlocked()
+
+ def _stop_unlocked(self):
+ if self._forkserver_pid is None:
+ return
+
+ # close the "alive" file descriptor asks the server to stop
+ os.close(self._forkserver_alive_fd)
+ self._forkserver_alive_fd = None
+
+ os.waitpid(self._forkserver_pid, 0)
+ self._forkserver_pid = None
+
+ os.unlink(self._forkserver_address)
+ self._forkserver_address = None
+
def set_forkserver_preload(self, modules_names):
'''Set list of module names to try to load in forkserver process.'''
if not all(type(mod) is str for mod in self._preload_modules):
diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py
index af5b91d..9a39f38 100644
--- a/Lib/test/_test_multiprocessing.py
+++ b/Lib/test/_test_multiprocessing.py
@@ -5650,7 +5650,13 @@ def install_tests_in_module_dict(remote_globs, start_method):
# Sleep 500 ms to give time to child processes to complete.
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()
diff --git a/Misc/NEWS.d/next/Tests/2019-07-05-14-47-55.bpo-37421.n8o2to.rst b/Misc/NEWS.d/next/Tests/2019-07-05-14-47-55.bpo-37421.n8o2to.rst
new file mode 100644
index 0000000..136faa2
--- /dev/null
+++ b/Misc/NEWS.d/next/Tests/2019-07-05-14-47-55.bpo-37421.n8o2to.rst
@@ -0,0 +1,3 @@
+multiprocessing tests now stop the ForkServer instance if it's running: close
+the "alive" file descriptor to ask the server to stop and then remove its UNIX
+address.