bw
Да к тож знает, какие у вас там “many_calculations”
Два вида, 1) например:
for i in xrange(10**8): k += i
2) рекурсивный обход некоторого дерева объектов с обращением к БД (SQLAlchemy) за данными этих объектов, т.е. обращений к БД в одной функции около нескольких десятков тысяч раз.
На stackoverflow имеются рекомендации в сторону ampoule. Twisted с multiprocessing использовать тоже не рекомендуют.
Ok, Начал разбираться с ampoule, создал команду и протокол:
class AnyCommand(amp.Command):
arguments = [("n", amp.Integer())]
response = [("response", amp.String())]
class AnyProtocol(child.AMPChild):
@AnyCommand.responder
def process(self, n):
res = many_calculations(n)
return {"response": resp}
и перенес ту самую many_calculations() в AnyProtocol, т.к. оставлять ее в render_GET нет никакого смысла.
Если это вычисления вида
for i in xrange(10**8): k += i
, то все ок, вычисления производятся в отдельном процессе и возвращается результат, а если это обращения к БД, то тут две проблемы:
- создание объекта сессии (вообще, как мне показалось проблема с импортом модулей в методе process)
- как описать возвращаемое значение в AnyCommand? Имеются типы amp.Integer(), amp.String(), а функция возвращает объект моего некоторого класса и размер этого объекта может быть больше 64 кБ