我的代码以简化形式显示如下:
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的问题。任何想法可能是导致这个问题的原因吗?
答案 0 :(得分:3)
在objgraph包的帮助下深入研究它,看起来代码泄漏了ExceptionStackContexts。这些是由gen.engine创建的,用于处理函数异常, 他们应该被清除,但显然你发现了一个错误。
我最好的猜测是,有一个参考留在某处。
编辑 - 龙卷风团队(Ben)找到了一个修复程序,它将在未来发布。 https://github.com/facebook/tornado/commit/bff07405549a6eb173a4cfc9bbc3fc7c6da5cdd7