Apache配置mod_wsgi在每次调用时调用before_first_request

时间:2017-10-29 06:36:37

标签: python apache caching flask mod-wsgi

我想将6GB文件加载到内存中,这样如果我收到请求,我就不必再加载它了。所以我能够通过添加简单的装饰器@ app.before_first_request在烧瓶服务器上实现这一点,但是当我使用相同的应用程序集成apache时,它会在每次请求之前调用此函数。

我的代码如下:

route.py

@app.before_first_request
def initialize():
    global SRC_PATH, MODEL
    path = SRC_PATH
    print("Loading Core files from {}".format(path))
    MODEL = Model.load(path+utils.MODEL_EXT)
    print("Loaded all files in memory")

@app.route("/test",methods=['POST'])
def search_index():
    # MyCode:
    return "some response"

我的apache配置是:

<VirtualHost *>
    WSGIDaemonProcess yourapplication user=ubuntu group=www-data
    WSGIScriptAlias / /xxx/app.wsgi
    <Directory /xxx/>
        WSGIProcessGroup yourapplication
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>
<VirtualHost *>

和app.wsgi

import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0, "/xxx/")
from route import app as application

现在在我的apache登录每个请求它加载核心文件: apache.log

[Sun Oct 29 06:21:14.691075 2017] [wsgi:error] [pid 22906:tid 140496053819136] Loading Core files from /xxx
[Sun Oct 29 06:21:20.919143 2017] [wsgi:error] [pid 22906:tid 140496053819136] Loaded all files in memory

虽然我希望在第一次请求之前或甚至在第一次请求之前加载它并将其永久保存到内存中吗?

1 个答案:

答案 0 :(得分:1)

我的问题是在代码中我使用多处理来加载文件。

因此,我没有进行多进程,而是将其更改为多线程。

以前使用多进程的代码如下:

from multiprocessing import Pool

我已将其更新为

from multiprocessing.dummy import Pool

其中multiprocessing.dummy是基于线程而非基于进程的。