gpt4 book ai didi

python - 扭曲的客户端内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-03 19:07:03 24 4
gpt4 key购买 nike

我有一个 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__ 方法添加到协议(protocol)和工厂中会使它们无法收集。请参阅 gc.garbage 列表。在此示例中,该列表将永远增长。如果删除 __del__ 方法,问题就会消失。在我的64位Ubuntu 12.04机器上,该客户端常驻内存使用稳定在13MB。

关于python - 扭曲的客户端内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14458834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com