使用Mod_WSGI和Bottle在Python脚本初始化时只加载一次文件

3 投票
3 回答
2541 浏览
提问于 2025-04-16 18:52

我刚接触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)

我该如何在初始化时只执行前四行(涉及解析器的那几行),这样我每次访问推荐页面时只需要调用res.recommend()就可以了?

谢谢大家的帮助,
Mo

3 个回答

0

你其实是在说缓存文件读取的结果。

我们把这个说得简单点:

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

另外,在网页方法中解析脚本输入参数其实是不太好的做法。这就像是在你同事的桌子里放了一条湿鱼一样。

更好的做法是,准备一个配置文件,把选项放在里面,然后读取这个配置文件。

如果你比较勇敢,可以看看一个记忆装饰器,把这个变成缓存的部分就留给你自己练习,因为缓存其实就是带过期时间的记忆。

1

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
3

对于守护进程模式,你需要把相关代码放在你的WSGI脚本文件的全局范围内。这个文件在每个进程中只会加载一次。通常情况下,这个加载会在第一次请求到达这个应用时发生。

而对于嵌入模式,如果你修改了WSGI脚本文件,它可以在同一个进程中重新加载。在这种情况下,即使是守护进程模式,如果你想要的话,也可以使用一个单独的脚本文件,并通过WSGIImportScript指令强制在进程启动时加载它。

详细信息请查看:

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

不过,你需要知道你的WSGI应用运行在哪个进程组或应用组中,这样它才能在同一个子解释器中被加载,所以也要查看WSGIProcessGroup和WSGIApplicationGroup指令。

撰写回答