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

Python 在Gunicorn/Flask应用程序中的进程之间共享静态全局数据,python,flask,multiprocessing,wsgi,gunicorn,Python,Flask,Multiprocessing,Wsgi,Gunicorn,我有一个Flask应用程序在Gunicorn下运行,使用同步工作进程类型和20个工作进程。该应用程序在启动时读取大量数据,这需要时间和内存。更糟糕的是,每个进程都加载自己的副本,这会导致它花费更长的时间,占用20倍的内存。数据是静态的,不会更改。我想加载一次,让所有20名员工共享 如果我使用preload\u app设置,它只在一个线程中加载,最初只占用1X内存,但一旦请求开始传入,它似乎会变为20X。我需要快速随机访问数据,所以我不想这样做 有没有办法在Gunicorn进程之间共享静态数据?内

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

如果我使用
preload\u app
设置,它只在一个线程中加载,最初只占用1X内存,但一旦请求开始传入,它似乎会变为20X。我需要快速随机访问数据,所以我不想这样做


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

内存映射文件将允许您在进程之间共享页面


请注意,内存消耗统计数据通常具有误导性,而且没有帮助。最好考虑VMSTAT的输出,看看你是否交换了很多。

< P>假设你的优先级是将数据保持为Python数据结构,而不是将其移动到数据库,比如ReDIS,那么你必须改变一些事情,这样你就可以为你的服务器使用一个进程。
Gunicorn可以使用协同路由创建一个服务器,该服务器可以在一个工作进程内支持多个客户端,这可能是满足您需要的一个好选择。

我想我应该说我想共享一个普通的Python dict,而不仅仅是一块内存。@DoctorJ那么您的运气就不好了。原因是Python数据结构只是指向内存中指针的指针,它将跨越许多页面。这些页面中的大多数也将与写入的数据共享,因此写时复制会导致每个进程中的页面重复。我建议使用像Redis这样的对象存储或键值存储——这是目前解决这个问题的“标准”解决方案。本地主机上的IPC速度非常快,如果您认为这将成为瓶颈,那么您可能过早地进行了优化。您能进一步解释一下吗?这听起来可能很有价值,但我不确定它会如何工作。这其实没什么区别,Flask从细节中提取了一些信息。当您使用gevent时,您只需要确保视图函数执行它们需要执行的操作,而不需要占用大量的CPU时间(如果它们是冗长的任务,也不需要让步)。多任务是通过将每个请求放在一个协程中来实现的,但这都是由框架来处理的。我的意思是让代码只在生成数据并保持更新的父进程中运行。与这个问题非常相似:当您使用gevent、eventlet或其他协同程序框架时,只有一个进程,没有父进程和子进程。在流程开始时,您可以加载或生成所需的任何数据,并将其放入全局范围,所有处理程序都可以访问这些数据,因为它们都在同一流程中运行。因为数据是静态的(至少在这个问题上是静态的),所以您甚至不必担心锁定问题。@Miguel gevent进程和gunicorn中的tornado进程等其他选择之间是否存在性能差异