Mohamed Benkedadra
Mohamed Benkedadra

Reputation: 2084

Start Django config app only once when using multiple Gunicorn workers

I'm using :

i have done the following:

and i have this code in api_app's 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)

and the following in api_app's __init__.py:

import os
default_app_config = 'apiapp.apps.ApiappConfig'

i'm creating an API so i am required to use multiple workers when deploying:

gunicorn api.wsgi -w 10

now, my issue is that the function job which is called when the server is started, is getting called 10 times because i'm using 10 gunicorn workers, i would like to call it only once

another thing that i would like to do is to have the settings.SHARED_VARIABLE variable, shared between the different workers. this variable will be updated only by the worker that will launch the app.py on server start.

Thank you !

Upvotes: 2

Views: 2273

Answers (1)

Valentin Lorentz
Valentin Lorentz

Reputation: 9753

gunicorn has a setting to do this: --preload

So, after I add this in settings.py: SHARED_VARIABLE = 'content of SHARED_VARIABLE' (and fixed apiapp/__init__.py to use the real app name), I can run gunicorn with the application loaded only once:

$ 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

Upvotes: 4

Related Questions