2012-11-15 259 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

經過測試,它的工作原理。輝煌! –