在 gunicorn workers 之间共享内存中的动态数据
Share dynamic data in memory between gunicorn workers
我有一个用 Django/Celery/Postgres/Gunicorn/Nginx 编写的网络应用程序。
该应用程序允许对用户进行科学模拟。这些模拟可能需要 5 秒到 5 分钟。常规请求和快速模拟是使用标准阻塞范式完成的,而长时间模拟在后台 运行 由 celery 进行(有些甚至并行提交到多个 AWS Lambda 实例),然后客户端由 WebSocket 更新。
当客户登录并打开他的项目之一时,Simulation 对象被初始化并作为 {user:Simulation} 存储在字典中。初始化此 Simulation 对象可能需要大约 10 秒,因此它只在开始时完成。每次用户在客户端与他的模拟交互时,一个特定的视图将模拟对象查询到全局字典并应用任何更改、检索数据、保存模拟、运行s 模拟等。
这种方法的问题在于它仅适用于 1 个 gunicorn worker,因为其他 worker 无法访问全局字典中的 Simulation 对象。此外,由于用户不断更改对象,因此无法预加载这些对象。
使用这种全局动态对象的最佳方法是什么,因为它太昂贵而无法在每次请求时重新初始化?
我想你需要一个内存缓存:
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!'
我有一个用 Django/Celery/Postgres/Gunicorn/Nginx 编写的网络应用程序。
该应用程序允许对用户进行科学模拟。这些模拟可能需要 5 秒到 5 分钟。常规请求和快速模拟是使用标准阻塞范式完成的,而长时间模拟在后台 运行 由 celery 进行(有些甚至并行提交到多个 AWS Lambda 实例),然后客户端由 WebSocket 更新。
当客户登录并打开他的项目之一时,Simulation 对象被初始化并作为 {user:Simulation} 存储在字典中。初始化此 Simulation 对象可能需要大约 10 秒,因此它只在开始时完成。每次用户在客户端与他的模拟交互时,一个特定的视图将模拟对象查询到全局字典并应用任何更改、检索数据、保存模拟、运行s 模拟等。
这种方法的问题在于它仅适用于 1 个 gunicorn worker,因为其他 worker 无法访问全局字典中的 Simulation 对象。此外,由于用户不断更改对象,因此无法预加载这些对象。
使用这种全局动态对象的最佳方法是什么,因为它太昂贵而无法在每次请求时重新初始化?
我想你需要一个内存缓存:
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!'