0

我正在使用 twisted 来处理基于文本的协议。最初,客户端连接到服务器。连接后,服务器将发送客户端应响应的命令。每种类型的命令需要不同的时间来制定响应。(例如:从本地哈希返回值与从大型数据库上的复杂 MySQL 查询返回值)。来自客户端的响应应该按照收到命令的顺序进行。服务器在发送另一个命令之前不会等待一个命令的响应,但期望响应命令已发送。客户端不能期望从服务器发送的命令有任何顺序。

以下是显示我的程序当前如何工作的概要的最小代码。

class ExternalListener(LineReceiver):
    def connectionMade(self):
        log.msg("Listener: New connection")

    def lookupMethod(self, command):
        return getattr(self, 'do_' + command.lower(), None)

    def lineReceived(self, verb):
        method = self.lookupMethod(verb)
        method(verb)

    def do_cmd1(self, verb):
        d = self.getResult(verb)
        d.addCallback(self._cbValidate1)

    def _cbValidate1(self):
        resp = "response"
        self.transport.write(resp)

    def do_cmd2(self, verb):
        d = self.getResult(verb)
        d.addCallback(self._cbValidate1)

    def _cbValidate2(self):
        resp = "response"
        self.transport.write(resp)

可以看出,这不会处理响应的顺序。我无法使用 DeferredList,因为延迟是在收到命令时创建的,并且没有可以放入 DeferredList 的延迟列表。

处理这种情况的扭曲方式是什么?

谢谢并恭祝安康,

4

1 回答 1

1

一种解决方案是使用带有请求和响应标签的协议。这意味着您可以按任何顺序生成响应。请参阅AMP(甚至IMAP4)作为此类协议的示例。

但是,如果协议超出您的控制并且您无法修复它,那么一个不太好的解决方案是缓冲响应以确保正确排序。

我不认为这里有任何特别的Twisted解决方案,这只是保持对新请求的响应,直到对旧请求的所有响应都已发送。这可能是在内部使用计数器为响应分配排序,然后实现逻辑以在需要等待时缓冲响应或发送响应,如果不需要则发送所有适当的缓冲响应。

于 2013-07-12T12:53:29.050 回答