【问题标题】:Twisted client memory leak扭曲的客户端内存泄漏
【发布时间】:2013-01-22 12:43:06
【问题描述】:

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

【问题讨论】:

  • 您的原始实现是否也覆盖了 __del__() 方法?如果是这样,您应该问自己为什么需要这样做。 99% 的情况是个坏主意。我在扭曲的应用程序中遇到了很多关于 memleaks 的问题,我发现 objgraph 库非常有助于追踪它们。

标签: python twisted


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 2011-01-09
    相关资源
    最近更新 更多