我编写了以下代码来处理扭曲中丢失的连接:
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
方法。
此代码有效,但我想知道是否有一种更优雅的方式来管理扭曲的连接结束? 谢谢!
答案 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。