Я пытался использовать tornado -redis (, который в основном является ответвлением brükva , слегка модифицированным для работы с интерфейсом tornado.gen вместо adisp. )для доставки событий с помощью redis' pubsub .
Итак, я написал небольшой скрипт для проверки, вдохновленный этим примером .
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()
К сожалению, по мере PUBLISH
прохождения redis-cli
использование памяти продолжало расти.
Чтобы профилировать использование памяти, я сначала попытался использовать guppy -pe , но это не сработало под python 2.7 (Да, я даже пробовал trunk ), поэтому я вернулся к пымплер .
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
Теперь, когда я знаю, что действительно существует утечка памяти, как мне отследить, где эти объекты были созданы? Думаю, мне следует начать здесь ?