2012-11-15 16 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によって関数例外を処理するために作成され、 はクリアされるべきですが、明らかにバグが見つかりました。

私の最高の推測は、リファレンスがどこかに残っているということです。

EDIT - Tornadoチーム(Ben)が修正を見つけました。今後のリリース予定です。 https://github.com/facebook/tornado/commit/bff07405549a6eb173a4cfc9bbc3fc7c6da5cdd7

+0

ちょうど事のように見えます。それをテストします。ありがとう! –

+0

テストして動作します。ブリリアント! –