[Twisted-Python] Error (and response) handling in protocols

Jason Heeris jason.heeris at gmail.com
Mon Feb 21 19:23:13 MST 2011


On 21 February 2011 22:45, Jason Rennie <jrennie at gmail.com> wrote:
> Sounds like you just need a queue of pending commands and a state object for
> the currently executing command.

Just for the sake of completeness, this is what I've ended up with. No
explicit queues, and the state is kept with a lock:

--------
class CommandProtocol(LineOnlyReceiver, TimeoutMixin):

    def __init__(self):
        self.lock = defer.DeferredLock()
        self.deferred = None

    def runCommand(self, command, payload=None):
        result = self.lock.run(self.sendCommand, command, payload)
        return result

    def sendCommand(self, command, payload=None):
        assert self.deferred is None, "Already waiting for reply!"

        # The parser uses these
        self.command = command
        self.sent = msg

        self.deferred = defer.Deferred()
        self.deferred.addCallback(self.parseReply)
        self.deferred.addBoth(self.cleanup)
        self.setTimeout(self.DEFAULT_TIMEOUT)
        self.sendLine(msg)
        return self.deferred

    def cleanup(self, res):
        self.deferred = None
        del self.command
        del self.sent
        return res

    def lineReceived(self, line):
        if self.deferred:
            self.setTimeout(None)
            self.deferred.callback(line)
        # If not, we've timed out or this is a spurious line

    def timeoutConnection(self):
        self.deferred.errback(
            Timeout("The device took too long to respond"))

    def parseReply(self, line):
        # Do parsing, raise synchronous errors if bad
        return reply
--------

Technically, things like self.command, self.sent, self.deferred etc.
could be closed over by nested functions, which could be set as the
callbacks, but that's just down to where and how you prefer to store
state. Besides, we all know that flat > nested ;)

Thanks for everyone's help!

— Jason




More information about the Twisted-Python mailing list