2012-11-15 1 views
7

Ho codice che, in forma semplificata, si presenta così:Perdita di memoria utilizzando gen.engine del 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() 

quando l'eseguo l'occupazione di memoria continua ad aumentare nel corso del tempo, più o meno linearmente. Se, tuttavia, mi tolgo la gen.engine nidificazione:

@gen.engine 
def go_for_it(): 
    while True: 
     r = yield gen.Task(client.fetch, 'http://localhost:8888/') 

utilizzo della memoria rimane costante.

Sono riuscito a riprodurre il problema con diverse versioni di tornado 2, sia su Mac OS X che Linux. Qualche idea su quale potrebbe essere la causa di questo problema?

risposta

3

Scavando in esso con l'aiuto del pacchetto objgraph, sembra che il codice trapelhi ExceptionStackContexts. Questi sono creati da gen.engine per gestire le eccezioni di funzione, dovrebbero essere chiariti ma chiaramente hai trovato un bug.

La mia ipotesi migliore è che ci sia un riferimento lasciato da qualche parte a uno.

MODIFICA - Il Tornado Team (Ben) ha trovato una soluzione e sarà in una versione futura. https://github.com/facebook/tornado/commit/bff07405549a6eb173a4cfc9bbc3fc7c6da5cdd7

+0

Sembra proprio la cosa. Lo testerà. Grazie! –

+0

Testato e funziona. Brillante! –