连接失败后 Twisted 继续阻塞
Twisted continues to block after connection fails
我正在开发一个使用 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()
结果是程序按您的预期打印出 "Connection Failed!"(只要主机不是 运行)。但是当连接失败时,代码永远不会完成。它继续阻止。我该如何阻止它?
我在网上查看了其他异步方法(例如 reactor.callInThread 和 reactor.callFromThread)。我试过 "deferToThread"。但无论如何,客户端似乎永远不会在连接失败后停止阻塞。
经过更多阅读和试验,我找到了答案。这非常简单。
诀窍是在 "clientConnectionFailed" 函数中添加一个 "reactor.stop()" 调用。
像这样:
def clientConnectionFailed(self, connector, reason):
print "Connection Failed!"
reactor.stop()
我正在开发一个使用 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()
结果是程序按您的预期打印出 "Connection Failed!"(只要主机不是 运行)。但是当连接失败时,代码永远不会完成。它继续阻止。我该如何阻止它?
我在网上查看了其他异步方法(例如 reactor.callInThread 和 reactor.callFromThread)。我试过 "deferToThread"。但无论如何,客户端似乎永远不会在连接失败后停止阻塞。
经过更多阅读和试验,我找到了答案。这非常简单。 诀窍是在 "clientConnectionFailed" 函数中添加一个 "reactor.stop()" 调用。
像这样:
def clientConnectionFailed(self, connector, reason):
print "Connection Failed!"
reactor.stop()