我写了以下代码来处理twisted中丢失的连接:
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
方法。在
这段代码可以工作,但我想知道是否有一种更优雅的方法来管理twisted中的连接末端? 谢谢!在
你面临的问题是控制+C正在调用一个已经安装好的信号处理程序来停止反应堆。reactor在停止时会调用您的
connectionLost
方法,因为关闭reactor会自动关闭所有连接。反过来,你的协议试图停止反应堆-却发现它已经停止了!在避免这种情况的一个简单(但并非完全正确)方法是在停止反应器之前查看其上的^{} 属性,如下所示:
(还请注意,您可能不应该那样检查异常类型;如果您确实关心原因的类型,您可能希望使用^{} ,但在大多数情况下,您不应该关心原因的类型;断开的连接就是断开的连接,除非您试图确定其中断性的某些非常特定的属性,例如终止是否应导致SSL会话终止)
如果你想更彻底地检查这个问题,你需要通过一个^{} system event trigger 来监控反应堆的状态,或者使用Twisted 12.3中介绍的^{} API 。在
相关问题 更多 >
编程相关推荐