uWSGI共享内存的最小例子?

时间:2017-01-19 05:55:57

标签: python django shared-memory uwsgi

有没有人有一个最小的工作示例,说明如何使用uWSGI在Django中的请求之间共享内存?

我有一个专有格式的大文件(不是数据库兼容的)我需要为每个请求加载。

instagram帖让我想到了哪些陈述:

  

对于应用程序服务器,我们使用具有预分叉模式的uWSGI来利用主进程和工作进程之间的内存共享。

你会如何设置这样的东西?

1 个答案:

答案 0 :(得分:0)

有多种处理方法:

通过“滥用”只读数据共享来共享数据

如果数据是只读的,则可以利用uWSGI正在执行python代码的事实来获取application,然后分叉到多个进程中。这意味着在发生派生之前所有已加载的数据将与您的所有进程共享。

这可能是一个很好的工具,因为您无需做任何处理多处理的操作就可以享受这种机制。但是要小心,一旦任何进程写入此数据,它将首先复制它以获取自己的本地版本。

Django并不容易,因为所有视图都是惰性的。这意味着在创建application时django将不会尝试运行与您的视图相关的代码。因此,要享受前叉共享,您需要将数据加载到视图外部的代码中。例如,您可以考虑在构建application对象之前或之后立即加载数据(例如在@ john-strood链接的要点中)。

使用uWSGI缓存框架

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

手动使用共享内存

作为最后的选择,如果您的数据不是只读的,并且您需要在所有请求中加载大块数据,那么大到即使通过unix套接字发送也将花费很长时间,那么您需要直接将数据加载到共享内存空间。在这里,uWSGI将无济于事,您将不得不自己处理锁定和多处理问题。 您可以参考multiprocessing's shared memory文档。