我有一个大的模型文件,我使用在我的webservice内置的瓶,然后通过Gunicorn服务。文件夹是结构化的,如下所示:
A.py
Folder_1\
__init__.py
B.py模型在__init__.py中加载并在B.py中使用,入口点是包含@app.routes, etc.的A.py
我开始使用A.py和--preload选项预加载应用程序和有8工人。
我面临着在8个核心上100%的CPU利用率;很明显,请求被卡在应用服务器上,没有被转发到DB。模型是否也被预加载并提供给所有8个工作人员,即它是否在工作进程之间共享?如果不是,我必须在A.py中加载模型,以便为所有工作人员预先加载该模型。
我认为模型是由每个工作过程加载的,而且由于模型很大,工人们都被困在那里了。
编辑1:由于通知我这可能是一个重复的问题,我想澄清的是,我不是在问python如何处理共享对象。我理解使用multiprocessing是可能的。在我的例子中,我与8名工人一起启动烧瓶服务器,使用预加载选项,我的应用程序有8个运行实例。我的问题是,由于代码是在工人被分叉之前预先加载的,所以持枪工人将共享同一个模型对象,或者每个人都有一个单独的副本。
发布于 2017-11-21 12:53:30
我的问题是,由于代码是在工人被分叉之前预先加载的,所以持枪工人将共享同一个模型对象,或者每个人都有一个单独的副本。
这将是一个单独的副本。
预加载只是利用了这样一个事实:当您调用操作系统的fork()调用来创建一个新进程时,操作系统能够在两个进程之间共享未修改的内存部分。通过预加载尽可能多的代码,进程之间共享了更多内存。
这只是一个幕后的操作系统优化:从每个单独的python进程的角度来看,它们都有每个对象的唯一副本。
https://stackoverflow.com/questions/45071875
复制相似问题