我知道 Twisted 不会“等待”......我正在使用 XMPP 客户端与外部进程交换数据。我发送了一个请求,需要获取相应的答案。我使用 sendMessage 将我的请求发送到服务器。当服务器应答时,onMessage 方法将接收它并检查它是否是对请求的应答(不一定是我正在寻找的应答)并将任何应答放入堆栈中。
作为返回到我的 sendRequest 我想返回结果,所以我想从堆栈中弹出对我的请求的响应并返回。
我阅读了线程、延迟、回调和条件,尝试了很多示例,但没有一个对我有用。所以我这里的示例代码是非常精简的伪代码来说明我的问题。任何建议表示赞赏。
class Foo(FooMessageProtocol):
def __init__(self, *args, **kwargs):
self.response_stack = dict()
super(Foo, self).__init__(*args, **kwargs)
def sendRequest(self, data):
self.sendMessage(id, data)
# I know that this doesn't work, just to illustrate what I would like to do:
while 1:
if self.response_stack.has_key(id):
break
return self.response_stack.pop(id)
def receiveAnswers(self, msg):
response = parse(msg)
self.response_stack[response['id']] = response
最佳答案
你不能将结果返回给 sendRequest
,因为 sendRequest
不能等待。
使 sendRequest
返回一个 Deferred
,并在结果到达时触发它。
所以调用 sendRequest
的代码可以只向 deferred 添加一个回调,当有响应时它会被调用。
像这样(伪代码):
class Foo(FooMessageProtocol):
def __init__(self, *args, **kwargs):
self._deferreds = {}
super(Foo, self).__init__(*args, **kwargs)
def sendRequest(self, data):
self.sendMessage(id, data)
d = self._deferreds[id] = defer.Deferred()
return d
def receiveAnswers(self, msg):
response = parse(msg)
id = response['id']
if id in self._deferreds:
self._deferreds.pop(id).callback(response)