मैं का उपयोग कर घटनाओं को वितरित करने के लिए tornado-redis (जो मूल रूप से brükva का एक कांटा है जो adisp के बजाय tornado.gen इंटरफ़ेस के साथ काम करने के लिए संशोधित) का उपयोग करने का प्रयास कर रहा है।मैं पंपप्लर का उपयोग करके टॉरनाडो-रेडिस में मेमोरी लीक को कैसे ट्रैक/ठीक कर सकता हूं?
इसलिए मैंने this example से प्रेरित चीजों का परीक्षण करने के लिए एक छोटी सी लिपि लिखी।
import os
from tornado import ioloop, gen
import tornadoredis
print os.getpid()
def on_message(msg):
print msg
@gen.engine
def listen():
c = tornadoredis.Client()
c.connect()
yield gen.Task(c.subscribe, 'channel')
c.listen(on_message)
listen()
ioloop.IOLoop.instance().start()
दुर्भाग्य से, के रूप में मैं redis-cli
स्मृति के उपयोग के माध्यम से PUBLISH
एड बढ़ती पर रखा।
मेमोरी उपयोग को प्रोफाइल करने के लिए मैंने पहले guppy-pe का उपयोग करने की कोशिश की लेकिन यह अजगर 2.7 (हाँ भी कोशिश की गई ट्रंक) के तहत काम नहीं करेगा, इसलिए मैं pympler पर वापस आ गया।
import os
from pympler import tracker
from tornado import ioloop, gen
import tornadoredis
print os.getpid()
class MessageHandler(object):
def __init__(self):
self.memory_tracker = tracker.SummaryTracker()
def on_message(self, msg):
self.memory_tracker.print_diff()
@gen.engine
def listen():
c = tornadoredis.Client()
c.connect()
yield gen.Task(c.subscribe, 'channel')
c.listen(MessageHandler().on_message)
listen()
ioloop.IOLoop.instance().start()
अब हर बार मैं PUBLISH
एड मैं देख सकता था कि कुछ वस्तुओं कभी नहीं जारी किया गया:
types | # objects | total size
===================================================== | =========== | ============
dict | 32 | 14.75 KB
tuple | 41 | 3.66 KB
set | 8 | 1.81 KB
instancemethod | 16 | 1.25 KB
cell | 22 | 1.20 KB
function (handle_exception) | 8 | 960 B
function (inner) | 7 | 840 B
generator | 8 | 640 B
<class 'tornado.gen.Task | 8 | 512 B
<class 'tornado.gen.Runner | 8 | 512 B
<class 'tornado.stack_context.ExceptionStackContext | 8 | 512 B
list | 3 | 504 B
str | 7 | 353 B
int | 7 | 168 B
builtin_function_or_method | 2 | 144 B
types | # objects | total size
===================================================== | =========== | ============
dict | 32 | 14.75 KB
tuple | 42 | 4.23 KB
set | 8 | 1.81 KB
cell | 24 | 1.31 KB
instancemethod | 16 | 1.25 KB
function (handle_exception) | 8 | 960 B
function (inner) | 8 | 960 B
generator | 8 | 640 B
<class 'tornado.gen.Task | 8 | 512 B
<class 'tornado.gen.Runner | 8 | 512 B
<class 'tornado.stack_context.ExceptionStackContext | 8 | 512 B
object | 8 | 128 B
str | 2 | 116 B
int | 1 | 24 B
types | # objects | total size
===================================================== | =========== | ============
dict | 32 | 14.75 KB
tuple | 42 | 4.73 KB
set | 8 | 1.81 KB
cell | 24 | 1.31 KB
instancemethod | 16 | 1.25 KB
function (handle_exception) | 8 | 960 B
function (inner) | 8 | 960 B
generator | 8 | 640 B
<class 'tornado.gen.Task | 8 | 512 B
<class 'tornado.gen.Runner | 8 | 512 B
<class 'tornado.stack_context.ExceptionStackContext | 8 | 512 B
list | 0 | 240 B
object | 8 | 128 B
int | -1 | -24 B
str | 0 | -34 B
अब मुझे पता है कि वहाँ वास्तव में एक स्मृति रिसाव है, मैं कैसे ट्रैक करते हैं, जहां उन ऑब्जेक्ट का निर्माण होगा? मुझे लगता है मुझे here शुरू करना चाहिए?
मुझे इस मुद्दे पर इंगित करने के लिए बहुत बहुत धन्यवाद। मैं उन्नयन और रिसाव + मंदी दूर चला गया :) –