【问题标题】:Minimal example of uWSGI's shared memory?uWSGI 共享内存的最小例子?
【发布时间】:2017-06-03 17:39:42
【问题描述】:

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

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

instagram 的帖子让我想到了以下内容:

对于应用服务器,我们使用 uWSGI 和 pre-fork 模式来利用主进程和工作进程之间的内存共享。

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

【问题讨论】:

标签: python django shared-memory uwsgi


【解决方案1】:

有多种处理方法:

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

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

这可能是一个很棒的工具,因为您不必做任何处理多处理的事情来享受这种机制。但请注意,一旦任何进程写入此数据,它就会先复制它以获得自己的本地版本。

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

使用uWSGI缓存框架

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

手动使用共享内存

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    相关资源
    最近更新 更多