Skip to content

Commit 94981cc

Browse files
committed
bpo-40307: Preserve manager Client in multiprocessing managers
1 parent 34a49aa commit 94981cc

2 files changed

Lines changed: 37 additions & 5 deletions

File tree

Lib/multiprocessing/managers.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -517,8 +517,7 @@ def connect(self):
517517
'''
518518
Connect manager object to the server process
519519
'''
520-
Listener, Client = listener_client[self._serializer]
521-
conn = Client(self._address, authkey=self._authkey)
520+
conn = self._Client(self._address, authkey=self._authkey)
522521
dispatch(conn, None, 'dummy')
523522
self._state.value = State.STARTED
524523

@@ -762,8 +761,13 @@ def __init__(self, token, serializer, manager=None,
762761
self._token = token
763762
self._id = self._token.id
764763
self._manager = manager
765-
self._serializer = serializer
766-
self._Client = listener_client[serializer][1]
764+
765+
if manager is not None:
766+
self._serializer = manager._serializer
767+
self._Client = manager._Client
768+
else:
769+
self._serializer = serializer
770+
self._Client = listener_client[serializer][1]
767771

768772
# Should be set to True only when a proxy object is being created
769773
# on the manager server; primary use case: nested proxy objects.
@@ -962,7 +966,10 @@ def AutoProxy(token, serializer, manager=None, authkey=None,
962966
'''
963967
Return an auto-proxy for `token`
964968
'''
965-
_Client = listener_client[serializer][1]
969+
if manager is not None:
970+
_Client = manager._Client
971+
else:
972+
_Client = listener_client[serializer][1]
966973

967974
if exposed is None:
968975
conn = _Client(token.address, authkey=authkey)

Lib/test/_test_multiprocessing.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2952,6 +2952,31 @@ def test_remote(self):
29522952
# Make queue finalizer run before the server is stopped
29532953
del queue
29542954

2955+
def test_client_propagation(self):
2956+
authkey = os.urandom(32)
2957+
2958+
manager = QueueManager(
2959+
address=(test.support.HOST, 0), authkey=authkey, serializer=SERIALIZER
2960+
)
2961+
manager.start()
2962+
self.addCleanup(manager.shutdown)
2963+
2964+
manager2 = QueueManager2(
2965+
address=manager.address, authkey=authkey, serializer=SERIALIZER
2966+
)
2967+
2968+
def MyXmlClient(*args, **kwargs):
2969+
return manager._Client(*args, **kwargs)
2970+
2971+
manager2._Client = MyXmlClient
2972+
manager2.connect()
2973+
queue = manager2.get_queue()
2974+
2975+
self.assertIsNot(queue._Client, manager._Client)
2976+
self.assertIs(queue._Client, manager2._Client)
2977+
2978+
del queue
2979+
29552980
class _TestManagerRestart(BaseTestCase):
29562981

29572982
@classmethod

0 commit comments

Comments
 (0)