Как уничтожить ресурс в настройке django + fastcgi + IIS? - PullRequest
3 голосов
/ 10 июля 2020

У меня интересная проблема. Я использую настройку IIS + FastCgi + Django для обслуживания запросов. Первоначально я надеялся на одновременное выполнение, но есть один компонент X , который не позволяет его многократный вызов из-за очевидного сбоя в его коде проверки лицензии при параллельном вызове. Чтобы убедиться, что работает только 1 экземпляр django, я планирую сделать следующее:

  1. IIS: Насколько я проверил, это не имеет ничего общего с параллелизмом напрямую. Я могу ошибаться.
  2. Модуль FastCGI в IIS:

Максимальное количество экземпляров: 1 (я думаю, это означает, что fastcgi будет загружать только 1 базу кода приложения django в памяти.)

Максимальный запрос экземпляра: 200 (Это гарантирует, что после того, как моя вышеуказанная кодовая база django приложение в памяти обработает 200 запросов последовательно, оно уничтожит себя и перезапустится.) Почему эта переработка даже необходимо?

Длина очереди: 1000 (Это создаст очередь входящих запросов, и даже если они поступают из нескольких источников, это гарантирует, что они не будут немедленно отклонены)

Django: теперь этот компонент X загружается примерно за 1-2 секунды, поэтому я не могу поместить его код загрузки в функцию просмотра POST. Я планирую поместить его в apps.py внутри класса, который расширяется от AppConfig django .apps, как люди загружают модели машинного обучения. Таким образом, он будет загружен только один раз, когда рабочий FASTCGI загрузит django базу кода приложения в память.

Проблема в том, что после запроса 200, когда быстрый cgi перерабатывает или уничтожает? загруженная django кодовая база, мне также нужно уничтожить экземпляр компонента X. Однако я не очень хорошо осведомлен об этом аспекте.

Способ загрузки этого компонента X (который является приложением windows):

X = library.sdk ( "name") // это в основном открывает соединение с com-объектом приложения.

Чтобы уничтожить этот компонент, официальная документация требует сделать следующее:

X.close ( )

Где поместить этот код X.close () в django? Кроме того, не стесняйтесь поправлять меня, если я ошибаюсь.

Изменить: добавлено вознаграждение

1 Ответ

0 голосов
/ 16 июля 2020

Разрешить параллелизм

Вы можете использовать механизмы блокировки, чтобы разрешить уникальный доступ к ресурсу и разрешить одновременный доступ к остальной части вашего сайта:

import threading
lock = threading.Lock()

def foo():
    with lock:
        bar()

Здесь вы можете найти некоторую документацию о синхронизации потоков в python: Механизмы синхронизации потоков в Python

Закройте компонент

Чтобы закрыть компонент, как указано в комментариях Daniel Батлер вы можете использовать класс и синглтон:

a = ClassA()

class ClassA():
    self.x_instance = None

    def __init__(self):
       self.x_instances = library.sdk("name")

    def __del__(self):
        self.x_instances.Close()
...