扭曲的客户端内存

2024-06-06 14:15:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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()的实例只有在程序关闭时才会被删除。连接完成后不会删除它们。我在文档中没有发现如果我需要做一些事情来删除工厂实例。在


Tags: fromimportechoself客户端connectordeftwisted
1条回答
网友
1楼 · 发布于 2024-06-06 14:15:20

向协议和工厂添加__del__方法会使它们无法接收。请参阅gc.garbage列表。在这个例子中,这个列表将永远增长。如果删除__del__方法,问题就会消失。在我的64位Ubuntu12.04机器上,这个客户机的驻留内存使用稳定在13MB。在

相关问题 更多 >