python - 使用 Tornado 的 gen.engine 内存泄漏

标签 python asynchronous memory-leaks tornado

我有一个简化形式的代码,如下所示:

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 重现了这个问题。有什么想法可能是这个问题的原因吗?

最佳答案

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

我最好的猜测是某处留下了一个引用。

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

关于python - 使用 Tornado 的 gen.engine 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13403760/

相关文章:

asynchronous - Clojure core.async 和 clojure.core 命名空间元素似乎发生了冲突

c++ - 刷新 boost::asio 中的所有异步处理程序

java - Primefaces JSF 多次打开对话框会缓慢增加浏览器内存

java - 程序终止时终止进程运行 `exec`

python - 当 ini 文件设置类型时创建一组对象 (Python)

python - 如何提取包含在字符串段落之间的 JSON 对象?

java - org.hibernate.impl.SessionFactoryImpl 对象的正常大小是多少?

Python:如何创建对引用的引用?

javascript - 获取正确的数据,但未达到我的预期

ruby-on-rails-3 - 在 Ruby on Rails 3/Postgres/Apache Passenger 应用程序中跟踪内存泄漏