django uWSGI共享内存的最小示例?

amrnrhlw  于 2023-10-21  发布在  Go
关注(0)|答案(2)|浏览(120)

有没有人有一个最小的工作示例来说明如何使用uWSGI在Django中跨请求共享内存?
我有一个专有格式的大文件(不兼容数据库),我需要为每个请求加载。
一个Instagram的帖子让我思考,它说:
对于应用程序服务器,我们使用uWSGI和预分叉模式来利用主进程和工作进程之间的内存共享。
你要怎么安排这种事?

ffscu2ro

ffscu2ro1#

有多种方法可以处理此问题:

只读数据“滥用”写时复制共享

如果你的数据是只读的,你可以利用uWSGI正在执行你的python代码的事实,在分叉到多个进程之前获取application。这意味着在fork发生之前已经加载的所有数据将与您的所有进程共享。
这可能是一个很好的工具,因为您不必做任何处理多处理的事情就可以享受这种机制。但是要小心,一旦任何进程写入此数据,它将首先复制它以获得自己的本地版本。
Django并没有让它变得简单,因为所有的视图都是懒惰的。这意味着当application被创建时,django不会尝试运行与你的视图相关的代码。因此,要享受预分叉共享,您需要在视图之外的代码中加载数据。例如,您可以考虑在构建application对象之前或之后加载数据(如@john-strood链接的gist中所示)。

使用uWSGI缓存框架

如果您需要写入此数据,第一个解决方案是使用uWSGI cache framework。它相当容易使用。你需要预先配置你需要多少内存,然后你所有的进程都可以读写它。您不必处理锁定或其他与多处理相关的问题。缺点是您的进程和uWSGI缓存的进程之间仍然会产生IO延迟。这对于微小的数据块来说是微不足道的,但对于千兆字节来说则是令人望而却步的。

手动使用共享内存

作为最后的手段,如果你的数据不是只读的,并且你需要在所有请求中加载大块,以至于即使通过unix套接字发送也会花费太长时间,那么你需要直接在共享内存空间中加载数据。这里uWSGI帮不上忙,您必须自己处理锁定和多处理问题。您可以参考multiprocessing's shared memory文档。

bksxznpy

bksxznpy2#

对于预分叉模式设置,这应该足够了:
master = true
但是,请确保您没有设置这一个:
lazy-apps = true这将防止预分叉。

相关问题