我正在使用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中。
处理这种情况的 twisted 方法是什么?
谢谢和问候,