2012-11-15 36 views
7

मैं कोड है, जो एक सरलीकृत रूप में, इस तरह दिखता है:मेमोरी रिसाव बवंडर के gen.engine का उपयोग कर

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/') 

स्मृति उपयोग लगातार बनी हुई है।

मै मैक ओएस एक्स और लिनक्स दोनों पर टॉरनाडो 2 के विभिन्न संस्करणों के साथ इस मुद्दे को पुन: पेश करने में कामयाब रहा हूं। कोई भी विचार इस समस्या का कारण क्या हो सकता है?

उत्तर

3

objgraph पैकेज की मदद से इसमें प्रवेश करना, ऐसा लगता है कि कोड ExceptionStackContexts को लीक करता है। ये कार्य अपवादों को संभालने के लिए gen.engine द्वारा बनाए जाते हैं, उन्हें साफ़ किया जाना चाहिए लेकिन स्पष्ट रूप से आपको एक बग मिला।

मेरा सबसे अच्छा अनुमान यह है कि एक संदर्भ कहीं भी छोड़ दिया गया है।

संपादित करें - टॉरनाडो टीम (बेन) को एक फिक्स मिल गया है और यह भविष्य में रिलीज में होगा। https://github.com/facebook/tornado/commit/bff07405549a6eb173a4cfc9bbc3fc7c6da5cdd7

+0

बस चीज़ की तरह दिखता है। इसका परीक्षण करेंगे। धन्यवाद! –

+0

इसका परीक्षण किया और यह काम करता है। प्रतिभाशाली! –