【问题标题】:Are Django settings shared across uwsgi workers?Django 设置是否在 uwsgi 工作人员之间共享?
【发布时间】:2019-04-22 08:53:41
【问题描述】:

我有一个 Django 应用程序,其设置(在我的 settings.py 文件中)在我的应用程序配置的 ready() 函数中动态填充。即在settings.py 我有:

POPULATE_THIS = None

然后在 apps.py 中准备好了:

def ready(self):
    if POPULATE_THIS is None:
        POPULATE_THIS = ... some code which instantiates an object I need that's effectively a singleton ...

这似乎工作正常。但我现在不仅仅是在本地运行开发服务器(即python manage.py runserver),我现在通过 uwsgi(在 nginx 后面代理)运行 Django 应用程序,并且 uwsgi 被配置为运行 10 个工作进程(即我的uwsgi ini文件有processes = 10threads = 1)。

我看到证据表明,即使有 10 个 uwsgi 进程,ready() 在应用程序启动时仍然只被调用一次,POPULATE_THIS 的值在所有工作人员中都是相同的(对其执行 str 会给出相同的内存地址)。

我的问题:如何在 uwsgi 进程之间共享该值,因为我认为单独的进程是不同的并且不共享任何内存?我假设ready() 将在每个应用程序启动时调用一次(即当 uwsgi 本身启动时),而不是在每个 uwsgi 工作进程启动时调用一次,这是否正确?

这个关于另一个问题的答案 (Multiple server processes using nginx and uWSGI) 似乎表明某些数据是在工作人员之间共享的,但我似乎找不到任何官方文档来说明共享的确切内容和方式,特别是关于 Django设置,所以一些解释/细节将不胜感激。

【问题讨论】:

  • 不太确定答案,只是一些想法:首先,var POPULATE_THIS 在每个 uwsgi 进程中指向相同的内存地址这一事实并不意味着它们共享内存,因为该地址是虚拟(非物理)并且每个进程都有完整的(有例外)可用的虚拟内存地址空间。您的两种观察结果的一种可能解释是,uwsgi 在每个应用程序初始化后分叉进程。我不知道是不是这样,但它可能是......
  • 据我所知,该值不能跨进程共享,但您的测试表明并非如此。也许正如@ivissani 所建议的那样,uwsgi 可能会在初始化后分叉进程。您可以编写一个视图方法,为 POPULATE_THIS 分配一个随机值,另一个返回它,并通过请求多次调用这些方法以查看它们的行为。
  • ^^ 很棒的提示,我做了这个,我看到它看起来确实分叉了这个过程,所以每个工人都得到了一个独立的 copy 设置。如果我更新其中一名工作人员的设置值,则该更改在其他工作人员中不可见。

标签: django python-3.x uwsgi


【解决方案1】:

没错。

似乎 uwsgi 只是 django 应用程序本身的垃圾邮件进程,因此所有函数 ready 在第一次运行期间只会被调用一次。

【讨论】:

    猜你喜欢
    • 2019-03-08
    • 2012-02-03
    • 1970-01-01
    • 2017-08-23
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    相关资源
    最近更新 更多