我有一个大型模型文件,我在我在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工作人员将共享相同的模型对象,或者他们将分别拥有单独的副本。?
答案 0 :(得分:1)
我的问题是,由于代码是在工作人员分叉之前预先加载的,因此gunicorn工作人员将共享相同的模型对象,或者他们将分别拥有单独的副本。?
这将是一个单独的副本。
预加载只是利用了这样一个事实:当您调用操作系统的fork()
调用来创建新进程时,操作系统能够在两个进程之间共享未修改的内存部分。通过预加载尽可能多的代码,可以在进程之间共享更多内存。
这只是一个幕后操作系统优化:从每个单独的python进程的角度来看,它们都有每个对象的唯一副本。