Пользовательская очистка приложения Django для перезагрузки кода

в моем проекте Django есть приложение, которое переопределяет его метод AppConfig.ready(). В готовом методе я запускаю отдельный multiprocessing.Process для обработки потребления из внешней очереди сообщений, похоже, это вызывает проблемы с автоперезагрузкой при изменении кода.

def infinite_loop():
    while True:
        time.sleep(10)


class BrokerConfig(AppConfig):
    name = 'backend.broker'
    has_started = False

    def ready(self):
        if not os.environ.get("RUN_MAIN"):
            # Avoid running for reloader
            return

        if BrokerConfig.has_started:
            return
        BrokerConfig.has_started = True

        proc = Process(target=infinite_loop)
        proc.start()

По какой-то причине это приводит к прерыванию автоматической перезагрузки кода. Кажется, перезагрузка не может очистить запущенные процессы. Перезагрузчик печатает это, а затем зависает:

.../backend/broker/apps.py changed, reloading.

Способ обойти это — сделать запущенный процесс демоном, но если такая настройка невозможна, мне все еще любопытно, как вы могли бы обойти это.

Я ищу способ добавить пользовательскую очистку при перезагрузке, но я не могу найти способ сделать это. Есть ли какой-то хук или сигнал, на который вы можете подписаться, чтобы узнать, была ли запущена перезагрузка?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
135
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне удалось сделать это наоборот, поэтому вместо того, чтобы слушать или подключаться к какому-либо сигналу Django, чтобы указать «входящий перезагрузка кода», я добавил прослушиватель в свой запущенный процесс для SIGTERM. Когда происходит перезагрузка, перезагрузка кода приводит к завершению процессов демона и, таким образом, к получению сигнала SIGTERM. Я не нашел способа сделать это с процессами, не являющимися демонами.

Окончательное решение

def infinite_loop():
    stop = False

    def stop():
        nonlocal stop
        stop = True

    signal.signal(signal.SIGTERM, stop)

    while True:
        if stop:
           break
        time.sleep(10)

class BrokerConfig(AppConfig):
    name = 'backend.broker'
    has_started = False

    def ready(self):
        if not os.environ.get("RUN_MAIN"):
            # Avoid running for reloader
            return

        if BrokerConfig.has_started:
            return
        BrokerConfig.has_started = True

        proc = Process(target=infinite_loop, daemon=True)
        proc.start()

Итак, в конце концов я все-таки выбрал демона, и нужная мне очистка была помещена в область действия запущенного процесса (как обработчик SIGTERM).

Другие вопросы по теме