gpt4 book ai didi

python - 在listenFailure后退出Twisted应用程序

转载 作者:行者123 更新时间:2023-11-30 23:41:29 24 4
gpt4 key购买 nike

我刚刚开始学习twisted并使用Tcp4endpoint类编写了一个小型tcp服务器/客户端。一切正常,除了一件事。

为了检测向服务器提供不可用端口作为监听端口的事件,我向端点延迟器添加了错误返回。这个错误返回被触发,但是,我无法从错误返回退出应用程序。 Reactor.stop 会导致另一个故障,表明reactor没有运行,而例如 sys.exit 会触发另一个错误。仅当我执行 ctrl+c 和 gc 命中时才能看到后两者的输出。

我的问题是,有什么办法可以让应用程序在发生listenFailure后(干净地)退出吗?

最佳答案

一个最小的例子将有助于使您的问题更清楚。然而,根据多年的 Twisted 经验,我有一个有根据的猜测。我认为你写了一个类似这样的程序:

from twisted.internet import endpoints, reactor, protocol

factory = protocol.Factory()
factory.protocol = protocol.Protocol
endpoint = endpoints.TCP4ServerEndpoint(reactor, 8000)
d = endpoint.listen(factory)
def listenFailed(reason):
reactor.stop()
d.addErrback(listenFailed)

reactor.run()

您走在正确的道路上。不幸的是,您遇到了订购问题。原因reactor.stop失败并显示 ReactorNotRunninglisten延迟在您调用 reactor.run 之前失败。也就是说,当你这样做时它已经失败了 d.addErrback(listenFailed ),所以listenFailed马上就被叫到了。

对此有多种解决方案。一种是编写.tac文件并使用服务:

from twisted.internet import endpoints, reactor, protocol
from twisted.application.internet import StreamServerEndpointService
from twisted.application.service import Application

application = Application("Some Kind Of Server")

factory = protocol.Factory()
factory.protocol = protocol.Protocol
endpoint = endpoints.TCP4ServerEndpoint(reactor, 8000)

service = StreamServerEndpointService(endpoint, factory)
service.setServiceParent(application)

这是使用 twistd 运行的,例如twistd -y thisfile.tac

另一个选择是使用服务所基于的低级功能,reactor.callWhenRunning :

from twisted.internet import endpoints, reactor, protocol

factory = protocol.Factory()
factory.protocol = protocol.Protocol
endpoint = endpoints.TCP4ServerEndpoint(reactor, 8000)

def listen():
d = endpoint.listen(factory)
def listenFailed(reason):
reactor.stop()
d.addErrback(listenFailed)

reactor.callWhenRunning(listen)
reactor.run()

关于python - 在listenFailure后退出Twisted应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12007316/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com