簡體   English   中英

扭曲的客戶端內存泄漏

[英]Twisted client memory leak

我有一個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__方法會使它們無法收集。 請參閱gc.garbage列表。 在此示例中,此列表將永遠增長。 如果刪除__del__方法,問題將消失。 在我的64位Ubuntu 12.04計算機上,此客戶端的常駐內存使用情況穩定在13MB。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM