Как долго длится процесс Django / Python / FastCGI? - PullRequest
2 голосов
/ 25 июля 2011

Я работал на веб-сайте в Джанго, обслуживался с использованием 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? Является ли он детерминированным, основанным на времени, количестве запросов, нагрузке или псевдослучайным? И безопасно ли выполнять такого рода кэширование в памяти (что на самом деле очень просто и удобно!), Или я должен найти какой-то правильный способ кэширования этих операций чтения из файла?

Ответы [ 2 ]

1 голос
/ 25 июля 2011

Похоже, вы уже знаете это.

  1. Когда вы редактируете файл Python.
  2. При перезагрузке сервера.
  3. При наличии неисправимой ошибки. Также известен как «только когда это необходимо».

Кэширование, как это хорошо - вы делаете это всякий раз, когда сохраняете что-либо в переменной. Поскольку информация доступна только для чтения, как это может быть небезопасно? Старайтесь не записывать изменения в файл сразу после перезапуска сервера; но самое худшее, что может случиться, - это неправильное представление одной страницы.

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

0 голосов
/ 27 июня 2014
...