Загрузка файла только один раз при инициализации скрипта Python с использованием Mod_WSGI и Bottle - PullRequest
3 голосов
/ 03 июня 2011

Я довольно новичок в Python, Mod_WSGI и Bottle.Моя главная проблема заключается в том, что когда процесс запускается с использованием Mod_WSGI, я хочу, чтобы он загружал файл один раз при инициализации.При запуске скрипта в терминале вы просто используете if __name__ == '__main__'

Мне нужно, чтобы он загружал файл один раз при инициализации (или при первом вызове), чтобы при любых последующих вызовах процесса файл не требовалсяперезагружается.Я не уверен, как это сделать.

Следующий код запускается всякий раз, когда кто-то переходит на страницу с рекомендациями

@route('/recommend')
def recommend():
    parser = OptionParser(usage="usage: %prog [options]")
    parser.add_option('-f', '--file', default='data.csv', help='Specify csv file to read item data from.')
    parser.add_option('-D', '--debug', action='store_true', dest='debug', help='Put bottle in debug mode.')
    (options, args) = parser.parse_args()
    return res.recommend(request)

Как мне сделать первые 4 строки (с парсером) простопри инициализации, чтобы мне просто нужно было вызывать res.recommend () при каждом обращении к рекомендуемой странице?

Любая помощь приветствуется, Mo

Ответы [ 3 ]

2 голосов
/ 03 июня 2011

Для режима демона поместите его в глобальную область в файле сценария WSGI.Этот файл загружается только один раз за процесс.Обычно это происходит по первому запросу, который сопоставляется с этим приложением.

Для режима emebedded, если вы измените файл сценария WSGI, он может быть снова загружен в том же процессе.В этом случае, и все же даже для режима демона, если вы хотите, используйте отдельный файл сценария и используйте директиву WSGIImportScript, чтобы принудительно загрузить его при запуске процесса.

См .:

http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIImportScript

Вам необходимо знать, в какой группе процессов / группе приложений выполняется ваше WSGI-приложение, чтобы оно загружалось в тот же субинтерпретатор, поэтому также посмотрите директивы WSGIProcessGroup / WSGIApplicationGroup.

0 голосов
/ 15 марта 2012

То, о чем вы на самом деле говорите, это кэширование результатов чтения файла.

Мы сделаем это просто:

datacache = None

@route("/someroute")
def someroute():
    if not datacache:
        datacache = do_something_clever_with_file(open("filename"))
    page = make_page_from_data(datacache)
    return page

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

Вместо этого, получите файл конфигурации с опциями там и прочитайте файл конфигурации.

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

0 голосов
/ 03 июня 2011

Модули Python запускаются только при первой загрузке.

При последующих вызовах код не запускается снова

Например,

mod.py:

x = 10
print(x)

main.py:

import mod #will print 10
mod.x = 5
import mod #nothing is printed. mod.x == 5
...