• Официальный сайт SDK
  • Сайт с примерами кода

Запросы и их кэширование

Среда выполнения языка Python выполняет кэширование импортируемых модулей и сохраняет их в оперативной памяти между двумя запросами, аналогично тому, как обычные приложения производят однократную загрузку модуля, даже если он используется несколькими файлами. Если в скрипте-обработчике определена функция main(), система также проведет его кэширование. В противном случае, скрипт будет загружаться при выполнении каждого запроса.

Механизм кэширования позволяет значительно уменьшить время отклика приложения. Мы рекомендуем использовать функцию main() во всех своих приложениях так, как это описано далее.

Кэширование импортируемых модулей

Для реализации эффективной работы web-сервер держит все импортируемые приложением модули в оперативной памяти и не перегружает их при последующих запросах пользователей, попадающих на этот же сервер. Большинство модулей не производят инициализацию глобальных переменных, и их кэширование не приведет к изменению в поведении приложения.

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

Следующий пример показывает механизм кэширования импортируемого модуля. Так как модуль mymodule импортируется только один раз, глобальной переменной mymodule.counter будет присвоено значение 0 только при первом запросе к серверу. Последующие запросы будут использовать значение из предыдущего запроса.

CiMjIyBteW1vZHVsZS5weQpjb3VudGVyID0gMApkZWYgaW5jcmVtZW50KCk6Cmdsb2JhbCBjb3VudGVyCmNvdW50ZXIgKz0gMQpyZXR1cm4gY291bnRlcgojIyMgbXloYW5kbGVyLnB5CmltcG9ydCBteW1vZHVsZQpwcmludCAmcXVvdDtDb250ZW50LVR5cGU6IHRleHQvcGxhaW4mcXVvdDsKcHJpbnQgJnF1b3Q7JnF1b3Q7CnByaW50ICZxdW90O015IG51bWJlcjogJnF1b3Q7ICsgc3RyKG15bW9kdWxlLmluY3JlbWVudCgpKQo==

Этот код выведет My number: #, где # будет числом, определяющим, сколько раз обработчик был вызван этим web-сервером.

Кэширование обработчиков запросов

Дополнительно к кэшированию импортируемых модулей можно дать указание платформе App Engine также выполнить кэширование кода обработчиков запросов. Если в скрипте-обработчике определена функция main(), система выполнит кэширование этого скрипта аналогично импортируемому модулю. При первом запросе к web-серверу система как обычно произведет загрузку скрипта. В последующих запросах App Engine будет повторно исполнять исключительно код функции main(), все остальное будет прокэшировано.

В этом случае платформа App Engine будет каждый раз вызывать функцию main() без аргументов. Если в скрипте-обработчике функция main() не определена, либо она требует указания дополнительных аргументов, система будет производить загрузку этого скрипта при каждом получении запроса.

Хранение скомпилированного кода Python в оперативной памяти позволяет ускорить работу приложения. Кэширование глобальной среды может пригодиться в следующих случаях:

  • Скомпилированные регулярные выражения. Все регулярные выражения будут проверены и сохранены в памяти в скомпилированном виде. Для удобства можно хранить регулярные выражения в глобальных переменных, и механизм кэширования не будет тратить время на повторный их разбор в последующих запросах.
  • Объекты GqlQuery. Запросы GQL также проходят проверку на правильность синтаксиса при создании объекта GqlQuery. Использование объекта GqlQuery с подстановкой параметров в запросе и последующий вызов метода bind() позволяет ускорить работу приложения с хранилищем. Аналогично, вы можете хранить объект GqlQuery в глобальной переменной с подстановкой параметров запроса и повторно использовать его без необходимости дополнительной обработки.
  • Конфигурация приложения и файлы данных. Если приложение хранит свою конфигурацию в отдельном файле, вместо того, чтобы оно разбирало ее при каждом запросе, ее можно проверить и загрузить один раз в оперативную память.

Следующий пример работает аналогично предыдущему, но показывает возможности кэширования:

CiMjIyBteWhhbmRsZXIucHkKIyDQk9C70L7QsdCw0LvRjNC90LDRjyDQv9C10YDQtdC80LXQvdC90LDRjywg0LrRjdGI0LjRgNGD0LXRgtGB0Y8g0LzQtdC20LTRgyDQt9Cw0L/RgNC+0YHQsNC80Lgg0Log0YHQtdGA0LLQtdGA0YMuCmNvdW50ZXIgPSAwCmRlZiBtYWluKCk6Cmdsb2JhbCBjb3VudGVyCmNvdW50ZXIgKz0gMQpwcmludCAmcXVvdDtDb250ZW50LVR5cGU6IHRleHQvcGxhaW4mcXVvdDsKcHJpbnQgJnF1b3Q7JnF1b3Q7CnByaW50ICZxdW90O015IG51bWJlcjogJnF1b3Q7ICsgc3RyKGNvdW50ZXIpCmlmIF9fbmFtZV9fID09ICZxdW90O19fbWFpbl9fJnF1b3Q7OgptYWluKCkK=

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

Использование кэширования приложения с помощью реализации метода main() приведет к значительному улучшению времени реакции на действия пользователей. Мы рекомендуем использовать его для всех приложений.