使用多个Gunicorn Worker时仅启动Django配置应用一次

时间:2018-12-22 22:03:38

标签: python django asynchronous gunicorn

我正在使用:

  • python 3.6
  • django == 2.1.1
  • gunicorn == 19.9.0

我已执行以下操作:

  • 创建了一个名为api的django项目
  • 创建了一个apiapp(我项目中的应用)

并且我在api_app的apps.py中有此代码:

from django.apps import AppConfig
from api import settings

class ApiappConfig(AppConfig):
    name = 'apiapp'
    verbose_name = "random_name"

    def ready(self):
        self.job()


    @classmethod
    def job(cls):
        ### doing whatever here for example :
        print(settings.SHARED_VARIABLE)

以及api_app的__init__.py中的以下内容:

import os
default_app_config = 'apiapp.apps.ApiappConfig'

我正在创建一个API,因此在部署时需要使用多个工作程序:

gunicorn api.wsgi -w 10

现在,我的问题是启动服务器时调用的函数job被调用了10次,因为我使用的是10个gunicorn worker,我只想调用一次

我想做的另一件事是让 settings.SHARED_VARIABLE变量,在不同的工作人员之间共享。此变量将仅由将在服务器启动时启动app.py的工作程序进行更新。

谢谢!

1 个答案:

答案 0 :(得分:1)

独角兽可以执行以下操作:--preload

因此,在settings.py中添加以下内容后:SHARED_VARIABLE = 'content of SHARED_VARIABLE'(并固定为apiapp/__init__.py以使用真实的应用程序名称),我可以在仅加载一次应用程序的情况下运行gunicorn:

$ gunicorn api.wsgi -w 10 --preload
content of SHARED_VARIABLE
[2018-12-31 10:12:15 +0000] [394] [INFO] Starting gunicorn 19.6.0
[2018-12-31 10:12:15 +0000] [394] [INFO] Listening at: http://127.0.0.1:8000 (394)
[2018-12-31 10:12:15 +0000] [394] [INFO] Using worker: sync
[2018-12-31 10:12:15 +0000] [399] [INFO] Booting worker with pid: 399
[2018-12-31 10:12:15 +0000] [400] [INFO] Booting worker with pid: 400
[2018-12-31 10:12:15 +0000] [401] [INFO] Booting worker with pid: 401
[2018-12-31 10:12:15 +0000] [403] [INFO] Booting worker with pid: 403
[2018-12-31 10:12:15 +0000] [404] [INFO] Booting worker with pid: 404
[2018-12-31 10:12:15 +0000] [405] [INFO] Booting worker with pid: 405
[2018-12-31 10:12:15 +0000] [406] [INFO] Booting worker with pid: 406
[2018-12-31 10:12:15 +0000] [408] [INFO] Booting worker with pid: 408
[2018-12-31 10:12:15 +0000] [410] [INFO] Booting worker with pid: 410
[2018-12-31 10:12:15 +0000] [411] [INFO] Booting worker with pid: 411