ИМХО, лучшим местом для данных только для чтения (включая импортированный код!), К которым необходимо обращаться в любое время по отдельным запросам, является область глобальных переменных приложения.
Такие переменные обычно загружаются ровно один раз заВремя жизни экземпляра GAE и доступно, пока экземпляр не исчезнет.
Поскольку загрузка данных стоит дорого, вы должны знать, что это может повлиять на время ответа на запросы, поступающие во время запуска экземпляра (то есть, когда запрос на загрузку все еще активен).Есть два способа решения этой проблемы:
Один из них - использовать «ленивую» загрузку данных - эффективно, если данные нужны только небольшому проценту входящих запросов.Но запросы, которым на самом деле нужны данные, когда они недоступны, все равно будут затронуты, поэтому это просто уменьшит влияние проблемы.Этот метод подробно описан в времени запуска App Engine и проблеме глобальных переменных статья:
from google.appengine.ext import ndb
# a global variable
gCDNServer = None
def getCDN():
global gCDNServer
if gCDNServer==None:
gCDNServer = Settings.query(Settings.name == "gCDNServer").value
return gCDNServer
другой подход, который полностью устранит проблему,чтобы приложение поддерживало запросов на разогрев (доступно только при использовании автоматического масштабирования).Данные будут загружены обработчиком запросов на разогрев и всегда будут доступны для «живых» запросов (поскольку «живые» запросы не будут направлены в экземпляр до завершения обработки запроса на разогрев).
Возможно добавить логику для удаления данных из памяти (чтобы уменьшить объем памяти приложения), если / когда вы знаете, что это больше не понадобится (т.е. после нескольких часов, которые вы упомянулисрок действия), но это усложняет картину, особенно если вы настроили приложение как threadsafe
.Я бы просто отделил код, который не нуждается в данных, от кода, который используется в разных сервисах, и оставил бы автоматическое масштабирование, чтобы отключить экземпляры с глобальными данными, когда они больше не нужны.