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

时间:2011-06-03 00:29:25

标签: python mod-wsgi bottle

我是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()?

感谢任何帮助, 沫

3 个答案:

答案 0 :(得分:2)

对于守护程序模式,将其放在WSGI脚本文件的全局范围内。该文件仅在每个进程中加载​​一次。这通常是第一个请求映射到该应用程序。

对于emebedded模式,如果修改WSGI脚本文件,则可以在同一进程中重新加载。在这种情况下,如果你愿意,甚至还可以使用守护进程模式,使用单独的脚本文件并使用WSGIImportScript指令强制在进程启动时加载它。

请参阅:

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

您需要知道运行WSGI应用程序的进程组/应用程序组是否要将其加载到同一个子解释器中,因此请查看WSGIProcessGroup / WSGIApplicationGroup指令。

答案 1 :(得分:0)

Python模块仅在您第一次加载时运行。

后续调用不会再次运行代码

E.g。

mod.py:

x = 10
print(x)

main.py:

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

答案 2 :(得分: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

此外,在Web方法中解析脚本输入参数只是一种不好的形式。就像把湿鱼留在你同事的办公桌里一样。

相反,请使用包含选项的配置文件并读取配置文件。

对于你们中间的勇敢者,看看a memoizing decorator,把它变成一个缓存留给读者作为练习,因为缓存只是带有过期的记忆。