Среда выполнения языка Python выполняет кэширование импортируемых модулей и сохраняет их в оперативной памяти между двумя запросами, аналогично тому, как обычные приложения производят однократную загрузку модуля, даже если он используется несколькими файлами. Если в скрипте-обработчике определена функция main(), система также проведет его кэширование. В противном случае, скрипт будет загружаться при выполнении каждого запроса.
Механизм кэширования позволяет значительно уменьшить время отклика приложения. Мы рекомендуем использовать функцию main() во всех своих приложениях так, как это описано далее.
Для реализации эффективной работы web-сервер держит все импортируемые приложением модули в оперативной памяти и не перегружает их при последующих запросах пользователей, попадающих на этот же сервер. Большинство модулей не производят инициализацию глобальных переменных, и их кэширование не приведет к изменению в поведении приложения.
Если ваше приложение импортирует модуль, который зависит от другого модуля, требующего для корректной работы повторной перегрузки перед каждым запросом, необходимо учитывать это поведение.
Следующий пример показывает механизм кэширования импортируемого модуля. Так как модуль mymodule импортируется только один раз, глобальной переменной mymodule.counter будет присвоено значение 0 только при первом запросе к серверу. Последующие запросы будут использовать значение из предыдущего запроса.
### mymodule.py counter = 0 def increment(): global counter counter += 1 return counter ### myhandler.py import mymodule print "Content-Type: text/plain" print "" print "My number: " + str(mymodule.increment())
Этот код выведет My number: #, где # будет числом, определяющим, сколько раз обработчик был вызван этим web-сервером.
Дополнительно к кэшированию импортируемых модулей можно дать указание платформе App Engine также выполнить кэширование кода обработчиков запросов. Если в скрипте-обработчике определена функция main(), система выполнит кэширование этого скрипта аналогично импортируемому модулю. При первом запросе к web-серверу система как обычно произведет загрузку скрипта. В последующих запросах App Engine будет повторно исполнять исключительно код функции main(), все остальное будет прокэшировано.
В этом случае платформа App Engine будет каждый раз вызывать функцию main() без аргументов. Если в скрипте-обработчике функция main() не определена, либо она требует указания дополнительных аргументов, система будет производить загрузку этого скрипта при каждом получении запроса.
Хранение скомпилированного кода Python в оперативной памяти позволяет ускорить работу приложения. Кэширование глобальной среды может пригодиться в следующих случаях:
Следующий пример работает аналогично предыдущему, но показывает возможности кэширования:
### myhandler.py # Глобальная переменная, кэшируется между запросами к серверу. counter = 0 def main(): global counter counter += 1 print "Content-Type: text/plain" print "" print "My number: " + str(counter) if __name__ == "__main__": main()
Примечание: Будьте внимательны и не допускайте вывод чужой пользовательской информации при использовании этого метода. В этих случаях избегайте использования глобальных переменных и всегда инициализируйте параметры, которые нельзя кэшировать, внутри метода main().
Использование кэширования приложения с помощью реализации метода main() приведет к значительному улучшению времени реакции на действия пользователей. Мы рекомендуем использовать его для всех приложений.