https://github.com/python/cpython/commit/5a15e7378996358848394930343e9633b6fec8a9
commit: 5a15e7378996358848394930343e9633b6fec8a9
branch: main
author: Denis Sergeev <[email protected]>
committer: gpshead <[email protected]>
date: 2025-09-17T14:45:52-07:00
summary:
gh-138813: Fix mutable default kwargs={} in multiprocessing BaseProcess and
DummyProcess to use None (GH-138814)
* gh-138813: Default `BaseProcess` `kwargs` to `None` (#138814)
Set `BaseProcess.__init__(..., kwargs=None)` and initialize `kwargs` with
`dict(kwargs) if kwargs else {}`. This avoids a shared mutable default and
matches threading.Thread behavior.
Co-authored-by: Dmitrii Chuprov <[email protected]>
* DummyProcess kwargs=None (which threading.Thread accepts properly)
Co-authored-by: Gregory P. Smith <[email protected]>
files:
A Misc/NEWS.d/next/Library/2025-09-17-08-32-43.gh-issue-138813.LHkHjX.rst
M Lib/multiprocessing/dummy/__init__.py
M Lib/multiprocessing/process.py
M Lib/test/_test_multiprocessing.py
diff --git a/Lib/multiprocessing/dummy/__init__.py
b/Lib/multiprocessing/dummy/__init__.py
index 6a1468609e347b..7dc5d1c8dde848 100644
--- a/Lib/multiprocessing/dummy/__init__.py
+++ b/Lib/multiprocessing/dummy/__init__.py
@@ -33,7 +33,7 @@
class DummyProcess(threading.Thread):
- def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
+ def __init__(self, group=None, target=None, name=None, args=(),
kwargs=None):
threading.Thread.__init__(self, group, target, name, args, kwargs)
self._pid = None
self._children = weakref.WeakKeyDictionary()
diff --git a/Lib/multiprocessing/process.py b/Lib/multiprocessing/process.py
index 9db322be1aa6d6..262513f295fde5 100644
--- a/Lib/multiprocessing/process.py
+++ b/Lib/multiprocessing/process.py
@@ -77,7 +77,7 @@ class BaseProcess(object):
def _Popen(self):
raise NotImplementedError
- def __init__(self, group=None, target=None, name=None, args=(), kwargs={},
+ def __init__(self, group=None, target=None, name=None, args=(),
kwargs=None,
*, daemon=None):
assert group is None, 'group argument must be None for now'
count = next(_process_counter)
@@ -89,7 +89,7 @@ def __init__(self, group=None, target=None, name=None,
args=(), kwargs={},
self._closed = False
self._target = target
self._args = tuple(args)
- self._kwargs = dict(kwargs)
+ self._kwargs = dict(kwargs) if kwargs else {}
self._name = name or type(self).__name__ + '-' + \
':'.join(str(i) for i in self._identity)
if daemon is not None:
diff --git a/Lib/test/_test_multiprocessing.py
b/Lib/test/_test_multiprocessing.py
index d9e572961152b3..850744e47d0e0b 100644
--- a/Lib/test/_test_multiprocessing.py
+++ b/Lib/test/_test_multiprocessing.py
@@ -5278,6 +5278,23 @@ def test_invalid_handles(self):
multiprocessing.connection.Connection, -1)
+#
+# Regression tests for BaseProcess kwargs handling
+#
+
+class TestBaseProcessKwargs(unittest.TestCase):
+ def test_default_kwargs_not_shared_between_instances(self):
+ # Creating multiple Process instances without passing kwargs
+ # must create independent empty dicts (no shared state).
+ p1 = multiprocessing.Process(target=lambda: None)
+ p2 = multiprocessing.Process(target=lambda: None)
+ self.assertIsInstance(p1._kwargs, dict)
+ self.assertIsInstance(p2._kwargs, dict)
+ self.assertIsNot(p1._kwargs, p2._kwargs)
+ # Mutating one should not affect the other
+ p1._kwargs['x'] = 1
+ self.assertNotIn('x', p2._kwargs)
+
@hashlib_helper.requires_hashdigest('sha256')
class OtherTest(unittest.TestCase):
diff --git
a/Misc/NEWS.d/next/Library/2025-09-17-08-32-43.gh-issue-138813.LHkHjX.rst
b/Misc/NEWS.d/next/Library/2025-09-17-08-32-43.gh-issue-138813.LHkHjX.rst
new file mode 100644
index 00000000000000..97f4d76bb2f454
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-09-17-08-32-43.gh-issue-138813.LHkHjX.rst
@@ -0,0 +1 @@
+:class:`!multiprocessing.BaseProcess` defaults ``kwargs`` to ``None`` instead
of a shared dictionary.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]