3

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

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

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

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

4

1 回答 1

4

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

避免这种情况的一种简单(但不完全正确)的方法是running在停止之前查看反应器上的属性,如下所示:

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

Failure.check(另请注意,您可能不应该以这种方式检查异常类型;如果您确实关心原因的类型,您可能想要使用它,但在大多数情况下,您不应该关心原因的类型;断开的连接只是断开的连接,除非您试图确定其断开的某些非常具体的属性,例如终止是否应该导致 SSL 会话终止。)

如果您想更彻底地检查这一点,您将需要通过"before", "shutdown"系统事件触发器监视反应器的状态,或使用Twisted 12.3 中引入的twisted.internet.task.reactAPI 。

于 2012-12-29T01:17:32.130 回答