【发布时间】:2017-02-03 03:58:33
【问题描述】:
我正在尝试构建服务器。除了像普通服务器一样接受来自客户端的连接外,我的服务器也将连接其他服务器作为客户端。
我已将协议和端点设置如下:
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?
-----更新-----
我的测试程序:服务器等待客户端连接。当客户端建立连接时,服务器将创建 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 中的一个错误,但您没有在此处附加足够的代码来说明。你能附上整个程序吗?
-
感谢回复!我的测试代码已更新。
-
这里确实似乎存在泄漏。事实上,我得到了 both 示例的泄漏,尽管基于 connectProtocol 的示例更快一些。这绝对是 Twisted 中的一个错误,我们需要进行调查。
标签: python memory-leaks twisted