Python Twisted:“等待”变量被另一个事件填充

时间:2010-09-03 14:48:58

标签: python asynchronous twisted

我知道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

1 个答案:

答案 0 :(得分:3)

您无法将结果返回sendRequest,因为sendRequest无法等待。 make 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)