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.port.stopListening()に遅延チェーンされたsite.cnx_cntの非同期ループチェックを実行します。

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

原子炉を停止する前にサービスの「クリーンシャットダウン」を確実にする正しい方法ですか?

ツイストを使用することは私にとってオプションではありません...(ため息)

4

1 に答える 1

0

一般的に、あなたは基本的に正しい考えを持っています。あなたのshutdown関数(表示されていないので、私にはわかりません)はDeferred、必要なクリーンアップが完了すると起動するを返すことができます。ただし、私は常に関連するコードをに作成してから、 ;IServiceを実行します。reactor.addSystemEventTrigger('before', 'shutdown', myService.stopService)これにより、テストが容易になりtwistd、可能性が利用可能になった場合に、後でサービスをプラグインサービス階層に統合できるようになります。

ただし、具体的には、ポートでのリッスンを停止するためだけにこれを行う必要はありません。リアクターは、シャットダウン時に自動的にそれを処理します。また、「非同期ループチェックを実行する」とはどういう意味ですか?接続カウントがゼロになるのを待っているだけの場合は、ゼロにDeferredなったらaを起動するだけで、ループすることはありません。

(コードサンプルの詳細は、これらの問題のいくつかに対処するのに役立ちます。)

于 2012-06-29T16:47:04.913 に答える