2012-12-28 183 views
2

管理connectionLost我写下面的代码段来处理扭曲连接丢失:如何适当地扭曲

class Foo(LineReceiver): 
    def connectionLost(self, reason): 
     if reason.type != ConnectionLost: 
      reactor.stop() 
    def terminate(self): 
     self.transport.loseConnection() 

terminate方法由一些输入/输出协议调用。 我必须在connectionLost方法中测试reason.type以避免出现错误 '当我用Ctrl-C中断我的程序而不是调用terminate方法的 '时,无法停止不运行的反应器。

此代码的工作原理,但我想知道是否有一个更优雅的方式来管理扭曲的连接结束? 谢谢!

回答

2

你面临的问题是,控制 + Ç被调用时停止该反应器已经安装的信号处理程序。反应器在停止时调用您的方法,因为关闭反应器会自动关闭所有连接。反过来,你的协议试图停止反应堆 - 只发现它已经停止!

一个简单(但并不完全正确)的方式来避免这种情况是看反应器上的running属性停止它之前,像这样:

def connectionLost(self, reason): 
    if reactor.running: 
     reactor.stop() 

(另请注意,你可能不应该请检查异常类型;您可能想要使用Failure.check代替,如果您真的关心原因的类型,但在大多数情况下您不应该关心原因的类型;断开的连接只是断开的连接,除非你试图确定某个特定的破坏属性,例如终端是否应该导致SSL会话终止。)

如果您希望更全面地检查此问题,您需要通过"before", "shutdown" system event trigger监测反应堆的状态,或使用Twisted 12.3中介绍的twisted.internet.task.react API

+1

它实际上比这更难解决。特别是'running'属性非常混乱,大多数人不正确地使用它。这是为什么Twisted 12.3引入'twisted.internet.task.react' API的很大一部分。 –

+0

更新了我的答案,以提到解决方案这个解决方案的不太正确的性质,并添加了一些其他选项。 – Glyph

+0

Glyph and Jean-Paul,非常感谢 – jean