Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Twisted:用于聊天协议的回调设计_Python_Twisted - Fatal编程技术网

Python Twisted:用于聊天协议的回调设计

Python Twisted:用于聊天协议的回调设计,python,twisted,Python,Twisted,我使用twisted处理基于文本的协议。最初,客户机连接到服务器。连接后,服务器将发送客户端应响应的命令。每种类型的命令都需要不同的时间来制定响应。(例如:从本地哈希返回值,而不是从大型数据库上的复杂MySQL查询返回值)。来自客户端的响应应该按照接收命令的顺序进行。在发送另一个命令之前,服务器不会等待一个命令的响应,但需要按照命令的发送顺序进行响应。客户端无法期望从服务器发送命令的任何顺序 下面是一段简单的代码,显示了我的程序当前的工作原理 class ExternalListener(Lin

我使用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,因为延迟是在收到命令时创建的,并且没有可以放入延迟列表中的延迟列表

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


谢谢大家,

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

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


我不认为这里有任何特别的扭曲的解决方案,它只是一个保留对较新请求的响应的问题,直到发送对较旧请求的所有响应为止。这可能是一个在内部使用计数器为响应分配排序的问题,然后实现逻辑,如果需要等待,则缓冲响应;如果不需要,则发送响应和所有适当的缓冲响应。

谢谢。我将尝试这种方法。