mirror of
https://github.com/python/cpython.git
synced 2025-10-22 06:32:43 +00:00
Issue #15064: Make BaseManager.__enter__() start server if necessary.
This commit is contained in:
parent
9c1feb88f3
commit
ac38571f00
3 changed files with 31 additions and 9 deletions
|
@ -1281,9 +1281,14 @@ their parent process exits. The manager classes are defined in the
|
||||||
|
|
||||||
The address used by the manager.
|
The address used by the manager.
|
||||||
|
|
||||||
Manager objects support the context manager protocol -- see
|
.. versionchanged:: 3.3
|
||||||
:ref:`typecontextmanager`. :meth:`__enter__` returns the
|
Manager objects support the context manager protocol -- see
|
||||||
manager object, and :meth:`__exit__` calls :meth:`shutdown`.
|
: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
|
.. class:: SyncManager
|
||||||
|
|
||||||
|
|
|
@ -561,6 +561,9 @@ class BaseManager(object):
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
|
if self._state.value == State.INITIAL:
|
||||||
|
self.start()
|
||||||
|
assert self._state.value == State.STARTED
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def __exit__(self, exc_type, exc_val, exc_tb):
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||||
|
|
|
@ -1888,7 +1888,27 @@ class _TestMyManager(BaseTestCase):
|
||||||
def test_mymanager(self):
|
def test_mymanager(self):
|
||||||
manager = MyManager()
|
manager = MyManager()
|
||||||
manager.start()
|
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()
|
foo = manager.Foo()
|
||||||
bar = manager.Bar()
|
bar = manager.Bar()
|
||||||
baz = manager.baz()
|
baz = manager.baz()
|
||||||
|
@ -1911,12 +1931,6 @@ class _TestMyManager(BaseTestCase):
|
||||||
|
|
||||||
self.assertEqual(list(baz), [i*i for i in range(10)])
|
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
|
# Test of connecting to a remote server and using xmlrpclib for serialization
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue