рабочий выход из Gunicorn - PullRequest
       26

рабочий выход из Gunicorn

0 голосов
/ 06 марта 2020

Я использую Gunicorn для развертывания приложения Django.

Существует глобальная переменная-одиночка, определенная в util.py:

global SNS_PRODUCERS
SNS_PRODUCERS = {}
def close_producers():
    logger.info('Closing all producers...')
    global SNS_PRODUCERS
    for name, producer in SNS_PRODUCERS.items():
        producer.close()

Я бы нравится звонить close_producers, когда мое приложение закрывается. Я добавил следующее в gunicornconf.py :

def child_exit(server, worker):
    # Join background threads in util.SNS_PRODUCERS
    try:
        from util import close_producers
        close_producers()
    except:
        pass


def worker_exit(server, worker):
    try:
        from util import close_producers
        close_producers()
    except:
        pass

Насколько я понимаю, существует один главный процесс, и несколько рабочих процессов разветвляются из главного процесса. В каждом процессе util.py импортируется в этот процесс. Таким образом, в этом процессе есть несколько SNS_PRODUCERS, один SNS_PRODUCERS в одном рабочем или главном процессе.

Каждый рабочий процесс имеет СВОЙ СОБСТВЕННЫЙ worker_exit хук. Главный процесс имеет СВОЙ СОБСТВЕННЫЙ child_exit hook.

Когда один рабочий выключается, вызывается его worker_exit, а затем СВОЙ SNS_PRODUCERS закрыто. Другие SNS_PRODUCERS все еще открыты.

Я прав? Любые исправления приветствуются.

...