2012-11-15 258 views
7

我有代码,以简单的形式,看起来是这样的:内存泄漏

from tornado import gen, httpclient, ioloop 

io_loop = ioloop.IOLoop.instance() 
client = httpclient.AsyncHTTPClient(io_loop=io_loop) 

@gen.engine 
def go_for_it(): 
    while True: 
     r = yield gen.Task(fetch) 

@gen.engine 
def fetch(callback): 
    response = yield gen.Task(client.fetch, 'http://localhost:8888/') 
    callback(response) 

io_loop.add_callback(go_for_it) 
io_loop.start() 

当我运行内存占用量不断随着时间的推移或多或少的线性增加。但是,如果我删除gen.engine嵌套:

@gen.engine 
def go_for_it(): 
    while True: 
     r = yield gen.Task(client.fetch, 'http://localhost:8888/') 

内存使用量保持不变。

我已经成功地在Mac OS X和Linux上重现了不同版本的龙卷风2的问题。任何想法可能是这个问题的原因?

回答

3

在objgraph包的帮助下挖掘它,它看起来像代码泄漏ExceptionStackContexts。这些是由gen.engine创建的,用于处理函数异常, 它们应该被清除,但显然你发现了一个错误。

我最好的猜测是有一个引用留在某个地方。

编辑 - 龙卷风团队(奔)发现了一个修复,它将在未来的版本。 https://github.com/facebook/tornado/commit/bff07405549a6eb173a4cfc9bbc3fc7c6da5cdd7

+0

看起来就是这样。将测试它。谢谢! –

+0

经过测试,它的工作原理。辉煌! –