没有人有一个最小的工作示例,说明如何使用uWSGI在Django中的请求之间共享内存?
我有一个专有格式的大文件(与数据库不兼容),需要为每个请求加载。
instagram帖子让我思考了哪个状态:
对于应用程序服务器,我们将uWSGI与前叉模式一起使用,以利用主进程与工作进程之间的内存共享。
您将如何设置类似的内容?
有多种处理方法:
如果数据是只读的,则可以利用uWSGI在分叉到多个进程之前执行python代码来获取application
的事实。这意味着在分叉发生之前已经加载的所有数据将与您的所有进程共享。
这可能是一个很好的工具,因为您无需执行任何处理多处理即可享受此机制。但是要小心,一旦任何进程写入此数据,它将首先复制它以获取其自己的本地版本。
Django并不容易,因为所有视图都是惰性的。这意味着在创建application
时django将不会尝试运行与您的视图相关的代码。因此,要享受前叉共享,您需要将数据加载到视图外部的代码中。例如,您可以考虑在构建application
对象之前或之后立即加载数据(例如在@ john-strood链接的要点中)。
如果需要写入此数据,第一个解决方案是使用uWSGI cache framework。相当容易使用。您需要预先配置所需的内存,然后所有进程才能对其进行读写。您不必处理锁定或其他与多处理相关的问题。缺点是您仍然会在进程与uWSGI缓存的进程之间产生IO延迟。对于微小的数据块来说,这是微不足道的,但对于千兆字节来说却是禁止的。
作为最后的手段,如果您的数据不是只读的,并且您需要在所有请求中加载大块数据,以至于即使通过unix套接字发送也将花费很长时间,那么您需要直接在共享内存空间。在这里,uWSGI将无济于事,您将不得不自己处理锁定和多处理问题。您可以参考multiprocessing's shared memory文档。