bpo-38546: multiprocessing tests stop the resource tracker (GH-17641)

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.
This commit is contained in:
Victor Stinner 2019-12-17 18:37:26 +01:00 committed by GitHub
parent 630c8df5cf
commit 9707e8e22d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 42 additions and 21 deletions

View 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

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

View File

@ -5695,16 +5695,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

View File

@ -1306,17 +1306,7 @@ def setUpModule():
def tearDownModule():
support.threading_cleanup(*_threads_key)
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()
support.gc_collect()
multiprocessing.util._cleanup_tests()
if __name__ == "__main__":

View File

@ -0,0 +1,2 @@
Multiprocessing and concurrent.futures tests now stop the resource tracker
process when tests complete.