issue #76: reduce Context duplication during unpickling
When unpickling a context, arrange for there to be a single instance representing that context, managed by the corresponding router. This context_by_id() was already in use by parent.py, it just needs to move down. This to eventually reach the point where a single Context exists that needs 'disconnect' fired on it, so all sleeping receivers are definitely woken.
This commit is contained in:
parent
72da291b24
commit
d7d40f1123
|
@ -1279,7 +1279,7 @@ def _unpickle_context(router, context_id, name):
|
||||||
(isinstance(name, UnicodeType) and len(name) < 100))
|
(isinstance(name, UnicodeType) and len(name) < 100))
|
||||||
):
|
):
|
||||||
raise TypeError('cannot unpickle Context: bad input')
|
raise TypeError('cannot unpickle Context: bad input')
|
||||||
return router.context_class(router, context_id, name)
|
return router.context_by_id(context_id, name=name)
|
||||||
|
|
||||||
|
|
||||||
class Poller(object):
|
class Poller(object):
|
||||||
|
@ -1732,6 +1732,15 @@ class Router(object):
|
||||||
_, (_, func, _) = self._handle_map.popitem()
|
_, (_, func, _) = self._handle_map.popitem()
|
||||||
func(Message.dead())
|
func(Message.dead())
|
||||||
|
|
||||||
|
def context_by_id(self, context_id, via_id=None, create=True, name=None):
|
||||||
|
context = self._context_by_id.get(context_id)
|
||||||
|
if create and not context:
|
||||||
|
context = self.context_class(self, context_id, name=name)
|
||||||
|
if via_id is not None:
|
||||||
|
context.via = self.context_by_id(via_id)
|
||||||
|
self._context_by_id[context_id] = context
|
||||||
|
return context
|
||||||
|
|
||||||
def register(self, context, stream):
|
def register(self, context, stream):
|
||||||
_v and LOG.debug('register(%r, %r)', context, stream)
|
_v and LOG.debug('register(%r, %r)', context, stream)
|
||||||
self._stream_by_id[context.context_id] = stream
|
self._stream_by_id[context.context_id] = stream
|
||||||
|
|
|
@ -1581,15 +1581,6 @@ class Router(mitogen.core.Router):
|
||||||
def allocate_id(self):
|
def allocate_id(self):
|
||||||
return self.id_allocator.allocate()
|
return self.id_allocator.allocate()
|
||||||
|
|
||||||
def context_by_id(self, context_id, via_id=None, create=True):
|
|
||||||
context = self._context_by_id.get(context_id)
|
|
||||||
if create and not context:
|
|
||||||
context = self.context_class(self, context_id)
|
|
||||||
if via_id is not None:
|
|
||||||
context.via = self.context_by_id(via_id)
|
|
||||||
self._context_by_id[context_id] = context
|
|
||||||
return context
|
|
||||||
|
|
||||||
connection_timeout_msg = u"Connection timed out."
|
connection_timeout_msg = u"Connection timed out."
|
||||||
|
|
||||||
def _connect(self, klass, name=None, **kwargs):
|
def _connect(self, klass, name=None, **kwargs):
|
||||||
|
|
Loading…
Reference in New Issue