WSGI — должно ли все идти ниже линии окружения, чтобы ничего не кэшировалось глобально?

Недавно я узнал, что размещение кода Python над этой строкой

def application(environ, start_response):

приведет к кэшированию вещей в 8 потоках.

Основываясь на моем файле журнала ошибок apache. Я снова и снова перезагружал свой сценарий wsgi и понял, что 8 потоков (процессов) создаются сценарием wsgi.

другими словами, этот код ниже..

import os
ooo = os.popen('/text-file.txt').read()

def application(environ, start_response):
    start_response('200 OK', [('content-type', 'text/html')])
    yield ooo

содержимое text-file.txt на самом деле

cached

в 8 разных темах.

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

/text-file.txt

модифицируется, обновляется.. и т.д..

решение, кажется, размещает

     ooo = os.popen('/text-file.txt').read()

под линией environ вот так:

import os

def application(environ, start_response):
    ooo = os.popen('/text-file.txt').read()
    start_response('200 OK', [('content-type', 'text/html')])
    yield ooo

этот приведенный выше код работает нормально.

ooo = os.popen('/text-file.txt').read()

основан на чтении файла в реальном времени и ничего не кэшируется в 8 процессах 8 раз.

вопрос вот в чем...

если у меня слишком много строк, таких как

ooo = os.popen('/text-file.txt')
ooo2 = ooo.read()
ooo3 = "something"
ooo4 = "something else"

я имею в виду, что в основном все это должно было бы пойти под

линия окружения

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

import os

def application(environ, start_response):
        ooo = os.popen('/text-file.txt')
        ooo2 = ooo.read()
        ooo3 = "something"
        ooo4 = "something else"
    start_response('200 OK', [('content-type', 'text/html')])
    yield ooo

если таких вещей слишком много.. должны ли они все быть помещены под

     def application(environ, start_response):

или они должны быть вызваны через

 functions ?

или это просто не важно?

каким будет метод создания самых быстрых кодов?


person Sümer Kolçak    schedule 12.06.2014    source источник
comment
Да, модули Python кэшируются. В этом смысл использования WSGI, чтобы не запускать новый интерпретатор Python для каждого запроса.   -  person Martijn Pieters    schedule 12.06.2014
comment
@Martijn Pieters, но это не просто модуль. это содержимое читаемого файла также кэшируется. где вы слышали о такой концепции в этом мире или в этой вселенной?   -  person Sümer Kolçak    schedule 12.06.2014
comment
@Martijn Pieters, вы пытались сказать ... передать путь к файлу классу или функции, которая определена над строкой окружения?   -  person Sümer Kolçak    schedule 12.06.2014
comment
Это потому, что вы помещаете этот код на уровень модуля. Этот код выполняется только один раз. где вы слышали о такой концепции в этом мире или в этой вселенной похоже, что вы что-то неправильно поняли о том, как работают модули Python.   -  person Martijn Pieters    schedule 12.06.2014
comment
@Martijn Pieters, но что именно он там кеширует (над строкой окружения) .. как модули могут даже кэшироваться .. модули состоят из строк или что?   -  person Sümer Kolçak    schedule 12.06.2014
comment
Модуль — это объект Python. Он загружается в память. Он содержит другие объекты Python, такие как функции, классы, строки и т. д. Это просто пространство имен.   -  person Martijn Pieters    schedule 12.06.2014
comment
@Martijn Pieters, если я размещу свое соединение с mysql над линией среды ... будет ли кэширован весь мой mysql или это просто соединение с mysql. а какой смысл кешировать подключение к mysql. это просто имя пользователя и несколько других символов, таких как имя базы данных и т. д., действительно ли их нужно кэшировать.   -  person Sümer Kolçak    schedule 12.06.2014
comment
Здесь нет «выше границы». Вы определили функцию. Эта функция вызывается для обработки запросов. Все, что находится за пределами функции и на уровне модуля, по определению не является частью функции и частью модуля и, таким образом, сохраняется как глобальное имя в модуле. Так что да, там хранится объект подключения MySQL.   -  person Martijn Pieters    schedule 12.06.2014
comment
Вам не хватает фундаментальных понятий о модели данных Python. Я предлагаю вам вернуться к руководству по Python и обратить внимание на то, как работает модель Python. Если вы любите приключения, изучите модель данных Python. Приложения Python WSGI — это не отдельные веб-страницы, которые выполняются каждый раз, когда приходит запрос.   -  person Martijn Pieters    schedule 12.06.2014


Ответы (1)


Все, что находится на верхнем уровне модуля Python, загружается только один раз при импорте модуля. Это задумано.

Сервер WSGI импортирует ваш модуль один раз для каждого процесса, а затем вызывает ваш метод application для обработки запросов. Если данные должны быть «свежими» для каждого запроса, не используйте глобальные переменные модуля.

Как вы затем формируете свои данные для каждого запроса, полностью зависит от вас. Использование функций для разделения вашей логики и повторного использования кода кажется чертовски хорошей идеей.

person Martijn Pieters    schedule 12.06.2014
comment
если бы эта концепция была на самом деле, было бы это эквивалентно использованию одной и той же корзины для транспортировки выстиранных носков из посудомоечной машины на балкон, а затем взятию той же корзины и транспортировке чего-то еще куда-то еще? - person Sümer Kolçak; 12.06.2014
comment
понятно вижу.. путь к балкону от посудомойки запоминается и здесь в wsgi и python он тоже запоминается.. кеширование то же самое что и запоминание - person Sümer Kolçak; 12.06.2014
comment
Нет, модуль Python — это робот, которого вы можете запрограммировать. Функция application — это подпрограмма, которая управляет переноской корзины для белья. Робот должен иметь все виды процедур, к которым он может обращаться, а также хранить данные о том, как добраться до балкона. Вы вызываете функцию application каждый раз, когда хотите взять на себя стирку, но роботу не нужно говорить, как добраться до балкона каждый раз, когда вы это делаете, или как держать корзину, или как опорожнить корзину, оказавшись там. . - person Martijn Pieters; 12.06.2014
comment
что ж, человек — это робот, который запоминает вещи и кэширует их в мозгу. поэтому удобнее стирать много вещей сразу, чем в разное время. человеческий разум кэширует, как была вымыта посуда. Все, что ему нужно сделать, это повторить процесс после кэширования предыдущего выполнения. - person Sümer Kolçak; 12.06.2014
comment
в функции, определенной над линией окружения.. скажем, линия окружения - это линия кухни.. внутри кухни запоминается, как моется посуда. но эту же функцию можно использовать и для мытья другой посуды. Я понял теперь. - person Sümer Kolçak; 12.06.2014