Twisted Python - 如果延迟超出范围,是否会被解雇?

时间:2014-11-21 00:04:34

标签: python twisted deferred

如果我创建一个Deferred并在reactor事件循环中添加一些回调,如果我让本地引用超出范围,它是否会被调用?例如,如果我有一个connectionMade()的协议,那么:

def connectionMade(self):
    # This made up function returns a deferred that will connect to 
    # some remote server using some made up protocol and return some data.
    d = connectToRemoteServer(reactor, url)
    d.addCallback(self._handleRemoteConnection)
    # At this point, d is going to go out of scope, so will the deferred
    # it points to ever get fired?

def _handleRemoteConnection(self, data):
    # Do something with the data

我在使用Twisted的不同代码中看到过这种模式,我无法理解为什么从connectToRemoteServer()返回的延迟不是 当d超出范围时收集的垃圾。我认为它永远不会发生,或者由于竞争条件而无法随机失败。任何人都可以向我解释为什么这有效吗?我已经阅读了http://twistedmatrix.com/documents/current/core/howto/defer.html几次,但我仍然不确定为什么会这样做?

谢谢,

卡尔

1 个答案:

答案 0 :(得分:2)

假设的connectToRemoteServer API将在内部对d进行引用,通常使用全局reactor对引发d的对象的引用(通过当d.callback表示的操作完成时调用d)。

因此引用从堆栈到reactor.run的堆栈帧(因为反应堆正在运行)到d