2010-09-03 128 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