Я работал на веб-сайте в Джанго, обслуживался с использованием FCGI, настроенного с использованием автоустановщика и системы пользовательских шаблонов.
Как я сейчас настроил, каждый View является экземпляром класса, который привязан к файлу шаблона во время загрузки , а не во время выполнения. То есть класс привязан к шаблону через декоратор:
@include("page/page.xtag") # bind template to view class
class Page (Base):
def main(self): # main end-point to retrieve web page
blah = get_some_stuff()
return self.template.main(data=blah) # evaluates template using some data
Одна вещь, которую я заметил, заключается в том, что, поскольку FCGI не создает новый процесс и не перезагружает все модули / классы при каждом запросе, изменения в шаблоне не появляются автоматически на веб-сайте до тех пор, пока я не выполню принудительный перезапуск (т.е. путем редактирования / сохранение файла Python).
Веб-страницы также содержат много данных, которые хранятся в файлах .txt в файловой системе. Например, я буду загружать большие фрагменты кода из отдельных файлов, а не оставлять их в шаблоне (где они загромождают его) или в базе данных (где их редактировать неудобно). Зная, что процесс является постоянным, я создал специальный memcache, сохранив текст, загруженный в статический словарь, в одном из моих классов:
class XLoad:
rawCache = {} #{name : (time, text)}
@staticmethod
def loadRaw(source):
latestTime = os.stat(source).st_mtime
if source in XLoad.rawCache.keys() and latestTime < XLoad.rawCache[source][0]:
# if the cached version of file is up to date, use it
return XLoad.rawCache[source][1]
else:
# otherwise read it from disk, dump it in cache and use that
text = open(source).read()
XLoad.rawCache[source] = (latestTime, text)
return text
Что значительно ускорило все, потому что два десятка или около того фрагментов кода, которые я загружал по одному из файловой системы, теперь были взяты прямо из памяти процесса. Каждый раз, когда я принудительно перезагружал, он выполнялся медленно для одного запроса, пока кэш заполнялся, а затем снова быстро вспыхивал.
Мой вопрос: что именно определяет, как / когда процесс перезапускается, классы и модули перезагружаются, а данные, которые я храню в моем статическом словаре, очищаются? Зависит ли это от моей установки Python, Django, Apache или FastCGI? Является ли он детерминированным, основанным на времени, количестве запросов, нагрузке или псевдослучайным? И безопасно ли выполнять такого рода кэширование в памяти (что на самом деле очень просто и удобно!), Или я должен найти какой-то правильный способ кэширования этих операций чтения из файла?