Issue #15064: Make BaseManager.__enter__() start server if necessary.
This commit is contained in:
parent
9c1feb88f3
commit
ac38571f00
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue