如果我创建一个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几次,但我仍然不确定为什么会这样做?
谢谢,
卡尔
答案 0 :(得分:2)
假设的connectToRemoteServer
API将在内部对d
进行引用,通常使用全局reactor
对引发d
的对象的引用(通过当d.callback
表示的操作完成时调用d
)。
因此引用从堆栈到reactor.run
的堆栈帧(因为反应堆正在运行)到d
。