我試圖建立一個服務器。除了像普通服務器那樣接受來自客戶端的連接外,我的服務器也會將其他服務器作爲客戶端連接。扭曲:使用connectProtocol連接端點導致內存泄漏?
我給自己定的協議和端點象下面這樣:
p = FooProtocol()
client = TCP4ClientEndpoint(reactor, '127.0.0.1' , 8080) # without ClientFactory
然後,呼叫reactor.run()
後,服務器會聽/接受新的套接字連接。當新的套接字連接時(在connectionMade),該服務器將調用connectProtocol(client, p)
,其作用像下面的僞代碼:
while server accept new socket:
connectProtocol(client, p)
# client.client.connect(foo_client_factory) --> connecting in this way won't
# cause memory leak
由於連接到客戶端製成,記憶正在逐漸被消耗(顯式調用gc
沒有按沒有工作)。
我是否以錯誤的方式使用Twisted?
----- ----- UPDATE
我的測試PROGRAME:服務器等待客戶端連接。當從客戶端連接時,服務器將創建到其他服務器
這50個連接是代碼:
#! /usr/bin/env python
import sys
import gc
from twisted.internet import protocol, reactor, defer, endpoints
from twisted.internet.endpoints import TCP4ClientEndpoint, connectProtocol
class MyClientProtocol(protocol.Protocol):
def connectionMade(self):
self.transport.loseConnection()
class MyClientFactory(protocol.ClientFactory):
def buildProtocol(self, addr):
p = MyClientProtocol()
return p
class ServerFactory(protocol.Factory):
def buildProtocol(self, addr):
p = ServerProtocol()
return p
client_factory = MyClientFactory() # global
client_endpoint = TCP4ClientEndpoint(reactor, '127.0.0.1' , 8080) # global
times = 0
class ServerProtocol(protocol.Protocol):
def connectionMade(self):
global client_factory
global client_endpoint
global times
for i in range(50):
# 1)
p = MyClientProtocol()
connectProtocol(client_endpoint, p) # cause memleak
# 2)
#client_endpoint.connect(client_factory) # no memleak
times += 1
if times % 10 == 9:
print 'gc'
gc.collect() # doesn't work
self.transport.loseConnection()
if __name__ == '__main__':
server_factory = ServerFactory()
serverEndpoint = endpoints.serverFromString(reactor, "tcp:8888")
serverEndpoint.listen(server_factory)
reactor.run()
這聽起來像是它可能是Twisted中的一個錯誤,但是您沒有在這裏附加足夠的代碼來告訴。你可以附加一個完整的程序嗎? – Glyph
感謝回覆!我的測試代碼已經做了更新。 –
這確實似乎有泄漏。實際上,我用*兩個*例子得到一個泄漏,儘管基於connectProtocol的例子有點快。這絕對是Twisted中的一個錯誤,我們需要進行調查。 – Glyph