有关Twisted Protocols和loopingCall的问题

时间:2015-04-15 20:00:51

标签: python twisted

假设我有一个带有标准Factory和Protocol子类的python twisted应用程序。我的Protocol子类connectionMade()方法启动一个每5分钟运行一次的loopingCall。我有两个问题:

  1. 假设连接丢失。是的我知道这会导致调用connectionLost()方法。但协议对象本身会发生什么?什么时候停止存在?是否立即收集垃圾?
  2. 该协议中的loopingCall会发生什么?如果我没有明确取消它,这是否意味着它会一直运行并阻止协议被垃圾收集?

1 个答案:

答案 0 :(得分:0)

当没有对它们的引用时,事情会被垃圾收集,所以我不能说当你的程序中的对象何时被收集。

但是,我可以告诉你保存的信息来自Twisted。

连接到Protocol的{​​{1}}将有一个全局变量→reactor→transport→protocol的引用。当运输关闭时,从反应器到运输的参考被打破。反应器仅引用传输以向其传递事件,并且由于断开连接的传输没有事件要传递,因此反应器可以丢弃它。因此,反应器不再参考该方案。此时,如果没有其他全局变量或活动堆栈变量引用它,它将被收集。

globals→reactor→TransportLoopingCall返回的对象)→DelayedCall绑定方法→callLater引用LoopingCall.__call__。如果LoopingCall的{​​{1}}属性(它正在调用的可调用对象)仍引用您的LoopingCall,那么是的,您的f对象将继续存在于内存中。但是,由于它不再具有有用的Protocol,因此用它做的并不多。