Как я могу создать переменную, которая ограничена одним запросом в движке приложения? - PullRequest
0 голосов
/ 08 июня 2009

Я создаю приложение на python для google app engine, и у меня возникла проблема с производительностью в некоторых дорогих операциях, которые повторяются в одном запросе. Чтобы помочь справиться с этим, я хотел бы создать своего рода мини-кеш, который будет ограничен одним запросом. Это в отличие от кэша всего сеанса или всего приложения, который не имеет смысла для моей конкретной проблемы.

Я думал, что мог бы просто использовать для этого глобальную переменную Python или переменную уровня модуля, но оказалось, что они поддерживают свое состояние между запросами неочевидными способами.

Я также не думаю, что memcache имеет смысл, потому что это приложение широко.

Мне не удалось найти хороший ответ на этот вопрос в документации Google. Может быть, это потому, что это либо глупая идея, либо совершенно очевидная, но кажется, что это было бы полезно, и я в замешательстве.

У кого-нибудь есть идеи?

Ответы [ 4 ]

2 голосов
/ 10 июня 2009

Если вы используете инфраструктуру webapp, включенную в App Engine (или, фактически, большинство других платформ WSGI-baesd), для каждого запроса создается новый RequestHandler. Таким образом, вы можете использовать переменные класса в своем классе обработчика для хранения данных по запросу.

2 голосов
/ 08 июня 2009

Что я обычно делаю, это просто создаю новый атрибут в объекте запроса. Тем не менее, я использую django с AppEngine, поэтому я не уверен, есть ли что-то другое в фреймворке appengine webapp.

def view_handler(request):
    if hasattr(request, 'mycache'):
        request.mycache['counter'] += 1
    else:
        request.mycache = {'counter':1,}

    return HttpResponse("counter="+str(request.mycache["counter"]))
1 голос
/ 08 июня 2009

Переменные модуля могут (или не могут) сохраняться между запросами (один и тот же экземпляр приложения может или не может оставаться в живых между запросами), но вы можете явно очистить их (del или, скажем, None, скажем) в начало обработки запроса или когда вы знаете, что с ним покончено. В худшем случае (если ваш код специально организован) вам нужно настроить функцию, которая будет всегда выполняться при каждом запуске запроса или при каждом конце запроса.

0 голосов
/ 08 июня 2009

использовать локальный список для хранения данных и делать model.put в конце обработки вашего запроса. сохранить несколько поездок по БД

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...