私はサーバーを構築しようとしていました。通常のサーバーのようにクライアントからの接続を受け入れるだけでなく、私のサーバーは他のサーバーをクライアントとしても接続します。Twisted: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
doesnのを呼び出します仕事はしません)。
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