如何正确管理twisted中的connectionLost

2024-09-29 23:26:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了以下代码来处理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中的连接末端? 谢谢!在


Tags: 方法代码selfiffoodeftypetwisted
1条回答
网友
1楼 · 发布于 2024-09-29 23:26:57

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

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

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

(还请注意,您可能不应该那样检查异常类型;如果您确实关心原因的类型,您可能希望使用^{},但在大多数情况下,您不应该关心原因的类型;断开的连接就是断开的连接,除非您试图确定其中断性的某些非常特定的属性,例如终止是否应导致SSL会话终止)

如果你想更彻底地检查这个问题,你需要通过一个^{} system event trigger来监控反应堆的状态,或者使用Twisted 12.3中介绍的^{} API。在

相关问题 更多 >

    热门问题