使用--preload的gunicorn工作者之间的内存共享

时间:2017-07-13 05:11:58

标签: python flask gunicorn

我有一个大型模型文件,我在我在Flask中构建的webservice中使用,然后通过Gunicorn服务。结构文件夹是这样的:

A.py
Folder_1\
    __init__.py
    B.py

模型已加载到__init__.py并在B.py中使用 输入点为A.py,其中包含@app.routes, etc.

我使用gunicorn启动A.py并使用--preload选项预加载应用,并且 8名工作人员

我在8核上面临100%的CPU利用率;显然请求被卡住了 在应用服务器上,而不是转发到数据库。 该模型是否也已预加载并可供所有8个工作人员使用,即它是否在工作进程之间共享? 如果不是,我必须在A.py中加载模型,以便为所有工作人员预加载模型。

我认为每个工人流程都会加载模型,因为模型很大,工人就会被困在那里。

编辑1 :由于我收到通知,这可能是一个重复的问题,我想澄清一点,我不是在问 python 如何处理共享对象。我了解可以使用multiprocessing。在我的情况下,我使用--preload选项从8名工作人员开始使用gunicorn的flask服务器,我的应用程序运行了8个实例。我的问题是,由于代码是在工作人员分叉之前预先加载的,因此gunicorn工作人员将共享相同的模型对象,或者他们将分别拥有单独的副本。?

1 个答案:

答案 0 :(得分:1)

  

我的问题是,由于代码是在工作人员分叉之前预先加载的,因此gunicorn工作人员将共享相同的模型对象,或者他们将分别拥有单独的副本。?

这将是一个单独的副本。

预加载只是利用了这样一个事实:当您调用操作系统的fork()调用来创建新进程时,操作系统能够在两个进程之间共享未修改的内存部分。通过预加载尽可能多的代码,可以在进程之间共享更多内存。

这只是一个幕后操作系统优化:从每个单独的python进程的角度来看,它们都有每个对象的唯一副本。