summaryrefslogtreecommitdiffstats
path: root/Lib/multiprocessing
diff options
context:
space:
mode:
authorLeo Trol <milestone.jxd@gmail.com>2022-06-09 16:55:12 (GMT)
committerGitHub <noreply@github.com>2022-06-09 16:55:12 (GMT)
commit30610d28374f5a9698d456cebf3ae496ac01af51 (patch)
tree92599812169f8f0239cc9010c8e2e4ab2ded98f1 /Lib/multiprocessing
parent6099611af5b9688f015ae4796501ce101a1c2f32 (diff)
downloadcpython-30610d28374f5a9698d456cebf3ae496ac01af51.zip
cpython-30610d28374f5a9698d456cebf3ae496ac01af51.tar.gz
cpython-30610d28374f5a9698d456cebf3ae496ac01af51.tar.bz2
gh-90549: Fix leak of global named resources using multiprocessing spawn (#30617)
Co-authored-by: XD Trol <milestonejxd@gmail.com> Co-authored-by: Antoine Pitrou <pitrou@free.fr>
Diffstat (limited to 'Lib/multiprocessing')
-rw-r--r--Lib/multiprocessing/context.py14
-rw-r--r--Lib/multiprocessing/process.py10
2 files changed, 22 insertions, 2 deletions
diff --git a/Lib/multiprocessing/context.py b/Lib/multiprocessing/context.py
index 8d0525d..b1960ea 100644
--- a/Lib/multiprocessing/context.py
+++ b/Lib/multiprocessing/context.py
@@ -223,6 +223,10 @@ class Process(process.BaseProcess):
def _Popen(process_obj):
return _default_context.get_context().Process._Popen(process_obj)
+ @staticmethod
+ def _after_fork():
+ return _default_context.get_context().Process._after_fork()
+
class DefaultContext(BaseContext):
Process = Process
@@ -283,6 +287,11 @@ if sys.platform != 'win32':
from .popen_spawn_posix import Popen
return Popen(process_obj)
+ @staticmethod
+ def _after_fork():
+ # process is spawned, nothing to do
+ pass
+
class ForkServerProcess(process.BaseProcess):
_start_method = 'forkserver'
@staticmethod
@@ -326,6 +335,11 @@ else:
from .popen_spawn_win32 import Popen
return Popen(process_obj)
+ @staticmethod
+ def _after_fork():
+ # process is spawned, nothing to do
+ pass
+
class SpawnContext(BaseContext):
_name = 'spawn'
Process = SpawnProcess
diff --git a/Lib/multiprocessing/process.py b/Lib/multiprocessing/process.py
index 3917d2e..c03c859 100644
--- a/Lib/multiprocessing/process.py
+++ b/Lib/multiprocessing/process.py
@@ -304,8 +304,7 @@ class BaseProcess(object):
if threading._HAVE_THREAD_NATIVE_ID:
threading.main_thread()._set_native_id()
try:
- util._finalizer_registry.clear()
- util._run_after_forkers()
+ self._after_fork()
finally:
# delay finalization of the old process object until after
# _run_after_forkers() is executed
@@ -336,6 +335,13 @@ class BaseProcess(object):
return exitcode
+ @staticmethod
+ def _after_fork():
+ from . import util
+ util._finalizer_registry.clear()
+ util._run_after_forkers()
+
+
#
# We subclass bytes to avoid accidental transmission of auth keys over network
#