* bpo-37421: multiprocessing tests call _run_finalizers() (GH-14527)
multiprocessing tests now call explicitly _run_finalizers() to remove
immediately temporary directories created by
multiprocessing.util.get_temp_dir().
(cherry picked from commit
039fb49c185570ab7b02f13fbdc51c859cfd831e)
Co-authored-by: Victor Stinner <vstinner@redhat.com>
(cherry picked from commit
632cb36084dc9d13f1cdb31a0e7e3ba80745a51a)
* 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>
(cherry picked from commit
229f6e85f8b4d57a2e742e0d3fc361c5bd15f1cb)
* bpo-38546: multiprocessing tests stop the resource tracker (GH-17641) (GH-17647)
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)
(cherry picked from commit
35acb3597208e10a101140474adec86859d57f61)
* Remove NEWS about resource tracker
Python 3.7 multiprocessing does not have resource tracker.
Co-authored-by: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
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):
finally:
os.close(errpipe_read)
os.close(errpipe_write)
+
+
+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()
+
+ # 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()
# Sleep 500 ms to give time to child processes to complete.
if need_sleep:
time.sleep(0.5)
- multiprocessing.process._cleanup()
- test.support.gc_collect()
+
+ multiprocessing.util._cleanup_tests()
remote_globs['setUpModule'] = setUpModule
remote_globs['tearDownModule'] = tearDownModule
BrokenExecutor)
from concurrent.futures.process import BrokenProcessPool
from multiprocessing import get_context
+import multiprocessing.util
def create_future(state=PENDING, exception=None, result=None):
test.support.run_unittest(__name__)
finally:
test.support.reap_children()
+ multiprocessing.util._cleanup_tests()
if __name__ == "__main__":
test_main()
--- /dev/null
+multiprocessing tests now explicitly call ``_run_finalizers()`` to
+immediately remove temporary directories created by tests.
--- /dev/null
+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.