0

我正在开发一个使用 Python Twisted 模块的相对简单的项目。它似乎运行良好,除非客户端的连接失败(我故意没有启动主机服务器来解决这个问题)它继续阻塞并且程序永远不会完成。

这是我正在尝试做的一个简化示例,它复制了这个问题:

#!/etc/python2.7
from twisted.internet import reactor, protocol



class Client_Protocol(protocol.Protocol):

    def connectionMade(self):
        print "A connection was made!"


class Client_Factory(protocol.ClientFactory):
    def buildProtocol(self, addr):
        return Client_Protocol()

    def clientConnectionFailed(self, connector, reason):
        print "Connection Failed!"


factory = Client_Factory()

reactor.connectTCP("localhost", 8000, factory)
reactor.run()

结果是程序打印出“连接失败!” 如您所料(只要主机没有运行)。但是当连接失败时,代码永远不会完成。它继续阻塞。我该如何阻止它?

我在网上查看了替代异步方法(如 reactor.callInThread 和 reactor.callFromThread)。我试过“deferToThread”。但无论如何,客户端似乎永远不会在连接失败后停止阻塞。

4

1 回答 1

0

经过更多的阅读和实验,我找到了答案。这出乎意料地简单。诀窍是在“clientConnectionFailed”函数中添加“reactor.stop()”调用。

像这样:

def clientConnectionFailed(self, connector, reason):
    print "Connection Failed!"
    reactor.stop()
于 2019-08-01T20:54:55.467 回答