Skip to content

Commit f72c7c6

Browse files
committed
bpo-40307: Preserve manager Client in multiprocessing managers
1 parent 11eec7a commit f72c7c6

2 files changed

Lines changed: 36 additions & 5 deletions

File tree

Lib/multiprocessing/managers.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -531,8 +531,7 @@ def connect(self):
531531
'''
532532
Connect manager object to the server process
533533
'''
534-
Listener, Client = listener_client[self._serializer]
535-
conn = Client(self._address, authkey=self._authkey)
534+
conn = self._Client(self._address, authkey=self._authkey)
536535
dispatch(conn, None, 'dummy')
537536
self._state.value = State.STARTED
538537

@@ -786,8 +785,13 @@ def __init__(self, token, serializer, manager=None,
786785
self._token = token
787786
self._id = self._token.id
788787
self._manager = manager
789-
self._serializer = serializer
790-
self._Client = listener_client[serializer][1]
788+
789+
if manager is not None:
790+
self._serializer = manager._serializer
791+
self._Client = manager._Client
792+
else:
793+
self._serializer = serializer
794+
self._Client = listener_client[serializer][1]
791795

792796
# Should be set to True only when a proxy object is being created
793797
# on the manager server; primary use case: nested proxy objects.
@@ -989,7 +993,10 @@ def AutoProxy(token, serializer, manager=None, authkey=None,
989993
'''
990994
Return an auto-proxy for `token`
991995
'''
992-
_Client = listener_client[serializer][1]
996+
if manager is not None:
997+
_Client = manager._Client
998+
else:
999+
_Client = listener_client[serializer][1]
9931000

9941001
if exposed is None:
9951002
conn = _Client(token.address, authkey=authkey)

Lib/test/_test_multiprocessing.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3517,6 +3517,30 @@ def test_remote(self):
35173517
# Make queue finalizer run before the server is stopped
35183518
del queue
35193519

3520+
def test_client_propagation(self):
3521+
authkey = os.urandom(32)
3522+
3523+
manager = QueueManager(
3524+
address=(socket_helper.HOST, 0), authkey=authkey, serializer=SERIALIZER,
3525+
shutdown_timeout=SHUTDOWN_TIMEOUT)
3526+
manager.start()
3527+
self.addCleanup(manager.shutdown)
3528+
3529+
manager2 = QueueManager2(
3530+
address=manager.address, authkey=authkey, serializer=SERIALIZER,
3531+
shutdown_timeout=SHUTDOWN_TIMEOUT)
3532+
3533+
def MyXmlClient(*args, **kwargs):
3534+
return manager._Client(*args, **kwargs)
3535+
3536+
manager2._Client = MyXmlClient
3537+
manager2.connect()
3538+
queue = manager2.get_queue()
3539+
3540+
self.assertIsNot(queue._Client, manager._Client)
3541+
self.assertIs(queue._Client, manager2._Client)
3542+
3543+
del queue
35203544

35213545
@hashlib_helper.requires_hashdigest('sha256')
35223546
class _TestManagerRestart(BaseTestCase):

0 commit comments

Comments
 (0)