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

时间:2014-11-10 22:57:33

标签: python flask multiprocessing wsgi gunicorn

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

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

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

2 个答案:

答案 0 :(得分:4)

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

https://docs.python.org/2/library/mmap.html

请注意,内存消耗统计信息通常具有误导性且无用。通常最好考虑vmstat的输出,看看你是否交换了很多。

答案 1 :(得分:1)

假设您的优先级是将数据保留为Python数据结构而不是将其移动到Redis等数据库,那么您将不得不进行更改,以便您可以为服务器使用单个进程。

Gunicorn可以使用gevent创建一个服务器,该服务器可以使用协同程序在单个工作进程中支持多个客户端,这可能是满足您需求的一个很好的选择。