如何在扭曲中正确管理connectionLost

时间:2012-12-28 23:06:00

标签: python twisted

我编写了以下代码来处理扭曲中丢失的连接:

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

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

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

1 个答案:

答案 0 :(得分:2)

您遇到的问题是 control + C 正在调用已经安装的停止反应堆的信号处理程序。在停止时,反应堆调用您的connectionLost方法,因为关闭反应堆会自动关闭所有连接。反过来,你的协议试图阻止反应堆 - 只是发现它已经停止了!

避免这种情况的一种简单(但不完全正确)的方法是在停止之前查看反应堆上的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