【问题标题】:Questions on Twisted Protocols and loopingCall关于 Twisted Protocols 和 loopingCall 的问题
【发布时间】:2015-04-15 20:00:51
【问题描述】:

假设我有一个带有标准工厂和协议子类的 python 扭曲应用程序。我的 Protocol 子类 connectionMade() 方法启动了一个 loopingCall,它每 5 分钟运行一次(比如说)。我有两个问题:

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

【问题讨论】:

    标签: python twisted


    【解决方案1】:

    当没有更多对它们的引用时,它们会被垃圾收集,所以我不能说你程序中的对象什么时候会被收集。

    不过,我可以告诉你 Twisted 保留的参考资料。

    连接到TransportProtocol 将具有全局→反应器→传输→协议的引用。当传输关闭时,从反应器到传输的引用被破坏。 reactor 仅引用传输以向其传递事件,并且由于断开连接的传输没有要传递的事件,因此反应器可以丢弃它。因此,反应堆不再引用该协议。此时,如果没有其他全局变量或活动堆栈变量引用它,它将被收集。

    一个LoopingCall被全局引用→reactor→DelayedCallcallLater返回的对象)→LoopingCall.__call__绑定方法→LoopingCall。如果LoopingCallf 属性(它正在调用的可调用对象)仍然引用您的Protocol,那么是的,您的Protocol 对象将继续存在于内存中。但是,由于它不再具有有用的transport,因此您无能为力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多