Найти - Пользователи
Полная версия: течёт память в twisted (кривые руки?)
Начало » Network » течёт память в twisted (кривые руки?)
1
kirik
Привет все!

Есть такая проблемка.. приложение на twisted течёт. Dowser толком ничего не говорит (а heapy/guppy под фряхой не работает), поэтому пришлось искать утечку методом научного тыка :)
Собственно вопрос: есть такой вот псевдокод:

class MyApp(server.Application):
def someMethod(self):
def deferMe():
print self.var
# deferMe()

def eb(fail):
return fail

def cb(result):
return result

d = threads.deferToThread(deferMe)
d.addCallback(cb)
d.addErrback(eb)

return d
# someMethod()
Метод someMethod вызывается на подключение каждого нового клиента. Есть ли вероятность утечки в этом месте? Нужно ли вынести функцию deferMe за класс MyApp (или может её нужно сделать отдельным методом этого класса)? (Так же и функции eb и cb)
И ещё вопрос, правильно ли использовать переменную self.var так как я написал (или её необходимо передавать вторым параметром в deferToThread и принимать первым аргументом функции deferMe)? Так-то оно впринипе работает :)

И вопрос до кучи и не по теме: есть ли возможность добавить к созданному объекту метод? Как?

Заранее огроменное спасибо!
Андрей Светлов
нормально все с примером.
kirik
Андрей Светлов
Спасибо, с этим ясно.
С последним вопросом тоже разобрался:
def someFn():
"""
...
"""

someObj.method = someFn # добавляем новый метод к объекту
ZAN
А что выполняет функция deferMe? Я к тому, что если это операция ввода-вывода, то не обязательно запускать ее в отдельном треде, т.к. ее можно (а в твистеде нужно) тоже сделать асинхронной.
На счет вложенности функций - вполне хороший подход, но если идут вложенности второго порядка, то лучше выносить в отдельный метод.
И метод errBack, если он однотипный - вывести ошибку в лог и больше ничего неделать, то лучше сделать отдельным методом и использовать для всех deferred.
kirik
ZAN
А что выполняет функция deferMe?
Она выполняет php скрипт через subprocess.Popen, а скрипт в свою очередь делает запросы к БД, работает с сессией. Плюс в некоторых случаях она рассылает сообщения другим подключённым клиентам.

ZAN
не обязательно запускать ее в отдельном треде, т.к. ее можно (а в твистеде нужно) тоже сделать асинхронной.
Я так понимаю через defer.Deferred()? Мне, честно говоря, тоже этот момент как-то не нравится, но другого придумать пока не смог :)

ZAN
если идут вложенности второго порядка, то лучше выносить в отдельный метод.
Лучше из-за читабельности? Или это как-то влияет на производительность?

ZAN
И метод errBack, если он однотипный - вывести ошибку в лог и больше ничего неделать, то лучше сделать отдельным методом и использовать для всех deferred.
Это логично! :) Спасибо! У меня там и callBack почти во всех случаях одну и ту же работу выполняет.
kirik
Ребят, подскажите пожалуйста, я верно запускаю cli-php скрипт?
Вот собственно такая функция:
def php(*args):
cmd = ['php', '/path/to/script.php']
for arg in args:
param = cgi.escape(str(arg), True)
cmd.append(param.strip())

proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout,stderr = proc.communicate()
if proc.returncode != 0:
print 'PHP RUN ERROR: ' + stderr + stdout
raise Exception('PHP RUN ERROR: ' + stderr + stdout)

return stdout
И если не сложно, опишите примерно как можно сделать запуск этой функции через defer.Deferred()? Внезапно обнаружил что deferToThread ограничен по умолчанию до 10 потоков (помимо того, что треды в моём случае использовать не Ъ).
Тобишь вызывается method1(), он возвращает deffered (на который уже вешается callback), и внутри запускает php скрипт. После получения результата скрипта вызывается callback() в функции php(). Не могу сообразить как выполнить php(), чтобы она не подвешивала всю программу..

Заранее спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB