1

毎分数百の接続を行う Twisted クライアント アプリがあります。アプリでメモリ リークが発生していることがわかりました。これは、決して削除されない ClientFactory() 派生クラスに関連しているとほぼ確信しています。

Twisted ドキュメントの Echo クライアントの例を変更して問題を再現します。

from twisted.internet.protocol import Protocol, ClientFactory
from twisted.internet import reactor
from twisted.internet.task import LoopingCall

from sys import stdout

class Echo(Protocol):
    def connectionMade(self):
        print 'MADE'
        self.transport.write('XXXX')

    def dataReceived(self, data):
        print 'RECV', data
        self.transport.loseConnection()

    def __del__(self):
        print 'DEL PROTOCOL'

class EchoClientFactory(ClientFactory):
    def startedConnecting(self, connector):
        print 'Started to connect.'

    def buildProtocol(self, addr):
        print 'Connected.'
        return Echo()

    def clientConnectionLost(self, connector, reason):
        print 'Lost connection.  Reason:', reason

    def clientConnectionFailed(self, connector, reason):
        print 'Connection failed. Reason:', reason

    def __del__(self):
        print 'DEL FACTORY'

def connector():
    print 'CONNECTOR'
    factory = EchoClientFactory()
    reactor.connectTCP('localhost', 7, factory)

#reactor.callLater(2, connector)
register_loop = LoopingCall(connector)
register_loop.start(1)

reactor.run()

このコードを使用すると、EchoClientFactory() のインスタンスは、プログラムがシャットダウンしたときにのみ削除されることがわかりました。接続が終了しても、それらは削除されません。ファクトリーインスタンスを削除するために何かをする必要があるかどうか、ドキュメントには見つかりませんでした。

4

1 に答える 1

1

__del__プロトコルとファクトリにメソッドを追加すると、それらを収集できなくなります。リストを参照してくださいgc.garbage。この例では、このリストは永遠に増えていきます。メソッドを削除する__del__と、問題は解決します。私の64ビットUbuntu12.04マシンでは、このクライアントの常駐メモリ使用量は13MBで安定しています。

于 2013-01-22T21:53:35.013 に答える