我正在使用 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 的延迟列表。
处理这种情况的扭曲方式是什么?
谢谢并恭祝安康,