【问题标题】:Memory leak using tornado's gen.engine使用 tornado 的 gen.engine 的内存泄漏
【发布时间】:2012-11-15 18:23:58
【问题描述】:

我的代码简化后如下所示:

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 上使用不同版本的 tornado 2 重现了这个问题。有什么想法可能是导致此问题的原因吗?

【问题讨论】:

    标签: python asynchronous memory-leaks tornado


    【解决方案1】:

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

    我最好的猜测是在某处留下了一个参考。

    编辑 - Tornado 团队 (Ben) 找到了一个修复程序,它将在未来的版本中发布。 https://github.com/facebook/tornado/commit/bff07405549a6eb173a4cfc9bbc3fc7c6da5cdd7

    【讨论】:

    • 看起来就是这样。会测试它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2019-09-14
    • 2011-06-11
    • 2011-07-27
    • 2018-06-01
    • 2017-05-06
    • 2011-02-13
    相关资源
    最近更新 更多