2010-09-03 97 views
3

我知道twisted将不会“等待”......我正在使用XMPP客户端与外部进程交换数据。我发送请求并需要获取相应的答案。我使用sendMessage将我的请求发送到服务器。当服务器回答一个onMessage方法时,它会收到它并检查它是否是一个请求的答案(不一定是我正在查找的那个)并将任何答案放入堆栈。 由于返回到我的sendRequest我想返回结果,所以我想从堆栈弹出对我的请求的响应并返回。 我读过关于线程,延迟,回调和条件的知识,尝试了很多示例,但都没有为我工作。所以我在这里的示例代码是非常精简的伪代码来说明我的问题。任何建议表示赞赏。Python Twisted:等待一个变量被另一个事件填充

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 

回答

3

你不能把结果返回给sendRequest,因为sendRequest等不及了。 使sendRequest取而代之返回Deferred,并在结果到达时触发它。

因此,调用sendRequest的代码可以将回调添加到延迟中,并在有响应时调用它。

是这样的(伪代码):

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) 
+0

谢谢!给我自己的两个注意事项:(1)一切都是对象,(2)RTFM至少两次!我没有得到关于延期的全部观点,并感谢你的例子和我在这一点上得到的文件,并设法解决问题。谢谢! – daccle 2010-09-04 15:18:04