Gunicorn 在多处理进程和工作进程之间共享内存

Posted

技术标签:

【中文标题】Gunicorn 在多处理进程和工作进程之间共享内存【英文标题】:Gunicorn shared memory between multiprocessing processes and workers 【发布时间】:2015-08-16 00:32:48 【问题描述】:

我有一个 python 应用程序,它使用字典作为多个进程之间的共享内存:

from multiprocessing import Manager
manager = Manager()
shared_dict = manager.dict()

REST API 是使用 Flask 实现的。在使用 pywsgi 或简单的 Flask.run 初始化 Flask 服务器时,一切正常。 我决定加入混合独角兽。现在,当我从任何工作人员(即使只有一个工作人员正在运行)访问这个共享字典时,我得到了错误:

message = connection.recv_bytes(256) # 拒绝大消息 IOError: [Errno 35] 资源暂时不可用

我一直在研究 mmap、多处理侦听器和客户端,它们看起来都有很多开销。

【问题讨论】:

【参考方案1】:

我不知道具体的错误,但我认为最可能的原因是,当您添加 Web 服务器时,进程会按需初始化,因此 manager_dict 在调用中丢失。如果 dict 不够大并且你可以支付序列化/反序列化的代价,使用redis 内存数据结构存储和py-redis 库是相当简单的。

【讨论】:

以上是关于Gunicorn 在多处理进程和工作进程之间共享内存的主要内容,如果未能解决你的问题,请参考以下文章

在多处理进程之间共享大型只读 Numpy 数组

Python 在多处理进程之间共享一个双端队列

在 gunicorn 工人之间共享一把锁

在 Kubernetes 中,我们还需要多进程/gunicorn 吗?

对Gunicorn的架构进行简要描述

线程和进程的关系