Commit ac38571f authored by Richard Oudkerk's avatar Richard Oudkerk

Issue #15064: Make BaseManager.__enter__() start server if necessary.

parent 9c1feb88
......@@ -1281,9 +1281,14 @@ their parent process exits. The manager classes are defined in the
The address used by the manager.
Manager objects support the context manager protocol -- see
:ref:`typecontextmanager`. :meth:`__enter__` returns the
manager object, and :meth:`__exit__` calls :meth:`shutdown`.
.. versionchanged:: 3.3
Manager objects support the context manager protocol -- see
:ref:`typecontextmanager`. :meth:`__enter__` starts the server
process (if it has not already started) and then returns the
manager object. :meth:`__exit__` calls :meth:`shutdown`.
In previous versions :meth:`__enter__` did not start the
manager's server process if it was not already started.
.. class:: SyncManager
......
......@@ -561,6 +561,9 @@ class BaseManager(object):
conn.close()
def __enter__(self):
if self._state.value == State.INITIAL:
self.start()
assert self._state.value == State.STARTED
return self
def __exit__(self, exc_type, exc_val, exc_tb):
......
......@@ -1888,7 +1888,27 @@ class _TestMyManager(BaseTestCase):
def test_mymanager(self):
manager = MyManager()
manager.start()
self.common(manager)
manager.shutdown()
# If the manager process exited cleanly then the exitcode
# will be zero. Otherwise (after a short timeout)
# terminate() is used, resulting in an exitcode of -SIGTERM.
self.assertEqual(manager._process.exitcode, 0)
def test_mymanager_context(self):
with MyManager() as manager:
self.common(manager)
self.assertEqual(manager._process.exitcode, 0)
def test_mymanager_context_prestarted(self):
manager = MyManager()
manager.start()
with manager:
self.common(manager)
self.assertEqual(manager._process.exitcode, 0)
def common(self, manager):
foo = manager.Foo()
bar = manager.Bar()
baz = manager.baz()
......@@ -1911,12 +1931,6 @@ class _TestMyManager(BaseTestCase):
self.assertEqual(list(baz), [i*i for i in range(10)])
manager.shutdown()
# If the manager process exited cleanly then the exitcode
# will be zero. Otherwise (after a short timeout)
# terminate() is used, resulting in an exitcode of -SIGTERM.
self.assertEqual(manager._process.exitcode, 0)
#
# Test of connecting to a remote server and using xmlrpclib for serialization
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment