首页 > 解决方案 > 在 gunicorn 工作人员之间共享内存中的动态数据

问题描述

我有一个用 Django/Celery/Postgres/Gunicorn/Nginx 编写的网络应用程序。

该应用程序允许对用户进行科学模拟。这些模拟可能需要 5 秒到 5 分钟。常规请求和快速模拟使用标准阻塞范式完成,而长时间模拟在后台运行(有些甚至并行提交给多个 AWS Lambda 实例),然后由 WebSocket 更新客户端。

当客户登录并打开他的一个项目时,一个 Simulation 对象被初始化并存储在一个字典中作为 {user:Simulation}。初始化此 Simulation 对象可能需要大约 10 秒,因此仅在开始时完成。每次用户在客户端与他的模拟交互时,一个特定的视图都会将模拟对象查询到全局字典并应用任何更改、检索数据、保存模拟、运行模拟等。

这种方法的问题在于它仅适用于 1 个 gunicorn 工人,因为其他工人无法访问全局字典内的 Simulation 对象。此外,由于用户不断更改对象,因此无法预加载对象。

使用这种全局动态对象的最佳方法是什么,因为每次请求都重新初始化太昂贵了?

标签: pythondjangotornadogunicornuwsgi

解决方案


我想你想要一个内存缓存:

https://docs.djangoproject.com/en/2.1/topics/cache/#memcached

基本接口是set(key, value, timeout)和get(key):

>>> from django.core.cache import cache
>>> cache.set('my_key', 'hello, world!', 30)
>>> cache.get('my_key')
'hello, world!'

推荐阅读