From 671f7532072ce0f3a4099b6f8a639e120f60d675 Mon Sep 17 00:00:00 2001 From: David Wilson Date: Tue, 27 Mar 2018 02:08:41 +0545 Subject: [PATCH] core: cache result of unpickling message. --- mitogen/core.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/mitogen/core.py b/mitogen/core.py index 9672e2ba..945e06a1 100644 --- a/mitogen/core.py +++ b/mitogen/core.py @@ -281,6 +281,7 @@ class Message(object): handle = None reply_to = None data = '' + _unpickled = object() router = None receiver = None @@ -324,15 +325,18 @@ class Message(object): def unpickle(self, throw=True, throw_dead=True): """Deserialize `data` into an object.""" _vv and IOLOG.debug('%r.unpickle()', self) - fp = cStringIO.StringIO(self.data) - unpickler = cPickle.Unpickler(fp) - unpickler.find_global = self._find_global + obj = self._unpickled + if obj is Message._unpickled: + fp = cStringIO.StringIO(self.data) + unpickler = cPickle.Unpickler(fp) + unpickler.find_global = self._find_global - try: - # Must occur off the broker thread. - obj = unpickler.load() - except (TypeError, ValueError), ex: - raise StreamError('invalid message: %s', ex) + try: + # Must occur off the broker thread. + obj = unpickler.load() + self._unpickled = obj + except (TypeError, ValueError), ex: + raise StreamError('invalid message: %s', ex) if throw: if obj == _DEAD and throw_dead: