0

class CnxAwareSite(server.Site):
    def __init__(self, *args, **kwargs):
        server.Site.__init__(self, *args, **kwargs)
        self.cnx_cnt = 0

    def buildProtocol(self, addr):
        channel = server.Site.buildProtocol(self, addr)

        def cntCnxMade(f):
            self.cnx_cnt += 1
            print 'new conn', self.cnx_cnt

            return f
        channel.connectionMade = cntCnxMade(channel.connectionMade)

        def cntCnxLost(f):
            def post_wrap(result):
                self.cnx_cnt -= 1
                return result

            return lambda *args, **kwargs: post_wrap(f(*args, **kwargs))
        channel.connectionLost = cntCnxLost(channel.connectionLost)

        return channel
...

site = CnxAwareSite(root)
site.port = reactor.listenTCP(PORT, site)

并安装了触发器,对 site.cnx_cnt 延迟链接到 site.port.stopListening() 执行异步循环检查

reactor.addSystemEventTrigger('before', 'shutdown', shutdown, site)

在停止反应堆之前确保服务的“干净关闭”是正确的方法吗?

使用 twistd 对我来说不是一个选择......(叹气)

4

1 回答 1

0

一般来说,您的想法基本上是正确的您的shutdown函数(未显示,因此我无法确定)可以返回 aDeferred在任何必要的清理完成时触发。但是,我总是把相关代码做成一个IService,然后做reactor.addSystemEventTrigger('before', 'shutdown', myService.stopService);这使测试更容易,并且可以在以后将您的服务集成到twistd插件服务层次结构中,如果您可以使用这种可能性。

但是,具体来说,您不需要仅仅为了停止侦听端口而执行此操作。反应堆将在关闭时自动为您处理。另外:“执行异步循环检查”是什么意思?如果你只是在等待连接计数变为零,那么你应该Deferred在它变为零时触发 a,你不应该循环。

(您的代码示例中的更多详细信息将有助于解决其中一些问题。)

于 2012-06-29T16:47:04.913 回答