相关疑难解决方法(0)

在Gunicorn/Flask应用程序中的进程之间共享静态全局数据

我有一个在Gunicorn下运行的Flask应用程序,使用同步工作器类型和20个工作进程.该应用程序在启动时读取大量数据,这需要时间并使用内存.更糟糕的是,每个进程加载自己的副本,这会导致它花费更长的时间并占用20倍的内存.数据是静态的,不会改变.我想加载一次,让所有20名员工分享它.

如果我使用该preload_app设置,它只在一个线程中加载,并且最初只需要1X内存,但是一旦请求开始进入,它似乎会变成20X.我需要快速随机访问数据,所以我宁愿不做IPC.

有没有办法在Gunicorn流程之间共享静态数据?

python wsgi multiprocessing flask gunicorn

14
推荐指数
1
解决办法
6316
查看次数

在gunicorn进程中共享一个numpy数组

我有一个存储在redis中的大型numpy数组.此数组充当索引.我想通过在gunicorn上运行的烧瓶应用程序通过http提供过滤结果,我希望gunicorn生成的所有工人都可以访问这个numpy数组.我不想每次都去redis并在内存中反序列化整个数组,而不是在启动时我想运行一些执行此操作的代码,并且每个分叉的gunicorn工作者只获取此数组的副本.问题是,我找不到任何关于如何使用gunicorn的服务器钩子的例子:http://docs.gunicorn.org/en/latest/configure.html#server-hooks 来实现这一点.可能是服务器挂钩不是正确的做法,有没有其他人做过类似的事情?

python ipc numpy flask gunicorn

10
推荐指数
1
解决办法
2199
查看次数

在gunicorn工人之间分享锁定

有没有一个很好的方法来分享gunicorn工人之间的多处理锁?我正在尝试用Flask编写一个json API.一些API调用将与管理正在运行的进程的python类进行交互(如用于视频转换的ffmpeg).当我将Web工作者的数量扩大到1以上时,如何确保只有1名工作人员同时与该班级进行交互?

我最初的想法是使用multiprocessing.Lock,所以start()函数可以是原子的.我不认为我已经找到了创建Lock的正确位置,以便在所有工作者之间共享一个:

# runserver.py
from flask import Flask
from werkzeug.contrib.fixers import ProxyFix
import dummy

app = Flask(__name__)

@app.route('/')
def hello():
    dummy.start()
    return "ffmpeg started"

app.wsgi_app = ProxyFix(app.wsgi_app)

if __name__ == '__main__':
    app.run()
Run Code Online (Sandbox Code Playgroud)

这是我的虚拟操作:

# dummy.py
from multiprocessing import Lock
import time

lock = Lock()

def start():
    lock.acquire()

    # TODO do work
    for i in range(0,10):
        print "did work %s" % i
        time.sleep(1)

    lock.release()
Run Code Online (Sandbox Code Playgroud)

当我刷新页面几次时,我看到每个调用的输出编织在一起.

我在这里吠叫错了吗?有没有更简单的方法来确保只有处理类的副本(这里只是虚拟start()方法)同时运行?我想我可能需要像celery这样的东西来运行任务(并且只使用1名工人),但这对我的小项目来说似乎有些过分.

python concurrency multiprocessing flask gunicorn

10
推荐指数
3
解决办法
6430
查看次数

跨多个工作人员共享 python 对象

我们已经使用 FastAPI 创建了一个服务。当我们的服务启动时,它会创建一些 Python 对象,然后端点使用这些对象来存储或检索数据。

生产中的 FastAPI 从多个工人开始。我们的问题是每个工人创建自己的对象而不是共享一个

下面的脚本显示了我们正在做的(简化的)示例,尽管在我们的例子中 Meta() 的使用要复杂得多。

from fastapi import FastAPI, status

class Meta:
   def __init__(self):
      self.count = 0  

app = FastAPI()

meta = Meta()

# increases the count variable in the meta object by 1
@app.get("/increment")
async def increment():
    meta.count += 1
    return status.HTTP_200_OK

# returns a json containing the current count from the meta object
@app.get("/report")
async def report():
    return {'count':meta.count}

# resets the count in the meta object to 0
@app.get("/reset") …
Run Code Online (Sandbox Code Playgroud)

python asynchronous python-asyncio fastapi

9
推荐指数
4
解决办法
3151
查看次数

在与Gunicorn一起部署时,如何在Flask方法之间共享内存资源

我使用Flask实现了一个简单的微服务,其中处理请求的方法根据请求数据和加载到内存中的相当大的数据结构计算响应.现在,当我使用gunicorn和大量工作线程部署此应用程序时,我只想在所有工作者的请求处理程序之间共享数据结构.由于只读取数据,因此不需要锁定或类似.做这个的最好方式是什么?

基本上需要的是:

  • 初始化服务器时加载/创建大型数据结构
  • 以某种方式获取请求处理方法内的句柄来访问数据结构

据我所知,gunicorn允许我实现各种钩子函数,例如在服务器初始化时,但是烧瓶请求处理程序方法对gunicorn服务器数据结构一无所知.

我不想为此使用redis或数据库系统之类的东西,因为所有数据都在需要加载到内存中的数据结构中,并且不必涉及反序列化.

对使用大数据结构的每个请求执行的计算可能很长,因此必须在每个请求的真正独立的线程或进程中同时发生(这应该通过在多核计算机上运行来扩展).

python multiprocessing flask gunicorn

7
推荐指数
1
解决办法
4146
查看次数

在我的枪手员工之间共享数据

我有一个Flask应用程序,由Nginx和Gunicorn和3名工人一起提供。我的Flask应用程序是一种API微服务,旨在处理NLP内容,而我正在使用spaCy库。

我的问题是,由于加载spaCy管道spacy.load('en')非常占用内存,因此他们占用了大量RAM,并且由于我有3个gunicorn工人,每个工人将占用约400MB的RAM。

我的问题是,是否有一种方法可以将管道加载一次并在我的所有枪业工人中共享?

python gunicorn spacy

6
推荐指数
1
解决办法
1742
查看次数

如何使用Flask和Gunicorn获得1000个请求的并发性

我有各自4 machine learning models的大小2GB,即8GB总数.我一次收到请求100 requests.每个请求都在进行中1sec.
我有一台机器15GB RAM.现在如果我增加了number of workersGunicorn,总内存消耗会很高.所以我不能增加超过2的工人数量.
所以我对此几乎没有问题:

  1. 工人share models or memory之间如何相处?
  2. sync or async考虑到上述情况,哪种类型的工人适合?
  3. 如果是解决方案,如何使用preload选项Gunicorn?我用它但它没有任何帮助.可能是我以错误的方式做这件事.

这是我正在使用的Flask代码
https://github.com/rathee/learnNshare/blob/master/agent_api.py

concurrency machine-learning flask gunicorn

5
推荐指数
1
解决办法
2745
查看次数