Форум сайта python.su
Привет все!
Есть такая проблемка.. приложение на 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()
Отредактировано (Сен. 18, 2011 10:27:52)
Офлайн
нормально все с примером.
Офлайн
Андрей Светлов
Спасибо, с этим ясно.
С последним вопросом тоже разобрался:
def someFn():
"""
...
"""
someObj.method = someFn # добавляем новый метод к объекту
Офлайн
А что выполняет функция deferMe? Я к тому, что если это операция ввода-вывода, то не обязательно запускать ее в отдельном треде, т.к. ее можно (а в твистеде нужно) тоже сделать асинхронной.
На счет вложенности функций - вполне хороший подход, но если идут вложенности второго порядка, то лучше выносить в отдельный метод.
И метод errBack, если он однотипный - вывести ошибку в лог и больше ничего неделать, то лучше сделать отдельным методом и использовать для всех deferred.
Офлайн
ZANОна выполняет php скрипт через subprocess.Popen, а скрипт в свою очередь делает запросы к БД, работает с сессией. Плюс в некоторых случаях она рассылает сообщения другим подключённым клиентам.
А что выполняет функция deferMe?
ZANЯ так понимаю через defer.Deferred()? Мне, честно говоря, тоже этот момент как-то не нравится, но другого придумать пока не смог :)
не обязательно запускать ее в отдельном треде, т.к. ее можно (а в твистеде нужно) тоже сделать асинхронной.
ZANЛучше из-за читабельности? Или это как-то влияет на производительность?
если идут вложенности второго порядка, то лучше выносить в отдельный метод.
ZANЭто логично! :) Спасибо! У меня там и callBack почти во всех случаях одну и ту же работу выполняет.
И метод errBack, если он однотипный - вывести ошибку в лог и больше ничего неделать, то лучше сделать отдельным методом и использовать для всех deferred.
Офлайн
Ребят, подскажите пожалуйста, я верно запускаю 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
Офлайн