parent: add Context.forget_chain().
This commit is contained in:
parent
37223adacd
commit
a3957d6aaf
11
docs/api.rst
11
docs/api.rst
|
@ -934,9 +934,9 @@ Context Class
|
||||||
if recv.get().unpickle() == 'baz':
|
if recv.get().unpickle() == 'baz':
|
||||||
pass
|
pass
|
||||||
|
|
||||||
Note that for long-lived programs, there is presently no mechanism
|
It is necessary to explicitly clean up the chain history on a
|
||||||
for clearing the chain history on a target. This will be addressed
|
target, otherwise unbounded memory usage is possible. See
|
||||||
in future.
|
:meth:`forget_chain`.
|
||||||
|
|
||||||
:returns:
|
:returns:
|
||||||
:class:`mitogen.core.Receiver` configured to receive the result
|
:class:`mitogen.core.Receiver` configured to receive the result
|
||||||
|
@ -977,6 +977,11 @@ Context Class
|
||||||
:raises mitogen.core.CallError:
|
:raises mitogen.core.CallError:
|
||||||
An exception was raised in the remote context during execution.
|
An exception was raised in the remote context during execution.
|
||||||
|
|
||||||
|
.. method:: forget_chain (chain_id)
|
||||||
|
|
||||||
|
Instruct the target to forget any exception related to `chain_id`, a
|
||||||
|
key previously used as the `mitogen_chain` parameter to
|
||||||
|
:meth:`call_async`.
|
||||||
|
|
||||||
|
|
||||||
Receiver Class
|
Receiver Class
|
||||||
|
|
|
@ -1959,6 +1959,11 @@ class Dispatcher(object):
|
||||||
policy=has_parent_authority)
|
policy=has_parent_authority)
|
||||||
listen(econtext.broker, 'shutdown', self.recv.close)
|
listen(econtext.broker, 'shutdown', self.recv.close)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
@takes_econtext
|
||||||
|
def forget_chain(cls, chain_id, econtext):
|
||||||
|
econtext.dispatcher._error_by_chain_id.pop(chain_id, None)
|
||||||
|
|
||||||
def _parse_request(self, msg):
|
def _parse_request(self, msg):
|
||||||
data = msg.unpickle(throw=False)
|
data = msg.unpickle(throw=False)
|
||||||
_v and LOG.debug('_dispatch_one(%r)', data)
|
_v and LOG.debug('_dispatch_one(%r)', data)
|
||||||
|
|
|
@ -1160,6 +1160,9 @@ class Context(mitogen.core.Context):
|
||||||
self, fn, args, kwargs)
|
self, fn, args, kwargs)
|
||||||
self.send(make_call_msg(fn, *args, **kwargs))
|
self.send(make_call_msg(fn, *args, **kwargs))
|
||||||
|
|
||||||
|
def forget_chain(self, chain_id):
|
||||||
|
self.call_no_reply(mitogen.core.Dispatcher.forget_chain, chain_id)
|
||||||
|
|
||||||
def shutdown(self, wait=False):
|
def shutdown(self, wait=False):
|
||||||
LOG.debug('%r.shutdown() sending SHUTDOWN', self)
|
LOG.debug('%r.shutdown() sending SHUTDOWN', self)
|
||||||
latch = mitogen.core.Latch()
|
latch = mitogen.core.Latch()
|
||||||
|
|
|
@ -143,6 +143,14 @@ class ChainTest(testlib.RouterMixin, testlib.TestCase):
|
||||||
lambda: self.local.call(func_returns_arg, 'yes', mitogen_chain='c1'))
|
lambda: self.local.call(func_returns_arg, 'yes', mitogen_chain='c1'))
|
||||||
self.local.call_no_reply(function_that_fails, 'c2', mitogen_chain='c2')
|
self.local.call_no_reply(function_that_fails, 'c2', mitogen_chain='c2')
|
||||||
|
|
||||||
|
def test_forget(self):
|
||||||
|
self.local.call_no_reply(function_that_fails, 'x1', mitogen_chain='c1')
|
||||||
|
e1 = self.assertRaises(mitogen.core.CallError,
|
||||||
|
lambda: self.local.call(function_that_fails, 'x2', mitogen_chain='c1'))
|
||||||
|
self.local.forget_chain('c1')
|
||||||
|
self.assertEquals('x3',
|
||||||
|
self.local.call(func_returns_arg, 'x3', mitogen_chain='c1'))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest2.main()
|
unittest2.main()
|
||||||
|
|
Loading…
Reference in New Issue