Я использую 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
все еще открыты.
Я прав? Любые исправления приветствуются.