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.
This commit is contained in:
Victor Stinner 2019-07-05 16:15:39 +02:00 committed by GitHub
parent 0d722f3cd6
commit 8fbeb14312
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 0 deletions

View File

@ -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):

View File

@ -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()

View File

@ -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.