簡略化した形式で次のようなコードがあります。
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 で問題を再現することができました。この問題の原因は何ですか?