Задать вопрос
@Xveeder

Как правильно создать глобальный контейнер?

Есть некоторый веб-фреймворк, несколько БД и брокер сообщений. Возникла мысль вынести конфиги и соединения с БД из контекста фреймворка в некоторый общий контейнер, состояние которого не зависит от контекста фреймворка, а доступ к этим ресурсом шарится между всеми потребителями (брокер сообщений, API).

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

Можно инстанцировать объект класса-контейнера и получать к нему доступ через функцию с кешированием, но может быть есть более правильный путь?
  • Вопрос задан
  • 114 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 1
@GofMan33333
Вы можете создать класс, который будет хранить состояние ресурсов и предоставлять к нему доступ через свойства или методы. Вам может потребоваться реализовать синглтон-паттерн, чтобы обеспечить, что экземпляр этого класса существует только в одном экземпляре на всем протяжении существования приложения. Также вам может потребоваться защитить состояние ресурсов от неправильного использования, реализовав некоторые методы для доступа к ресурсам.

В качестве примера:

from threading import Lock

class ResourceContainer:
    _instance = None
    _lock = Lock()

    def __new__(cls):
        with cls._lock:
            if cls._instance is None:
                cls._instance = super().__new__(cls)
        return cls._instance

    def __init__(self):
        self._db_connection = None
        self._message_broker_connection = None
        self._config = {}

    def get_db_connection(self):
        return self._db_connection

    def set_db_connection(self, connection):
        self._db_connection = connection

    def get_message_broker_connection(self):
        return self._message_broker_connection

    def set_message_broker_connection(self, connection):
        self._message_broker_connection = connection

    def get_config(self):
        return self._config

    def set_config(self, config):
        self._config = config


В этом примере создается класс ResourceContainer, который реализует синглтон-паттерн с помощью метода __new__ и мьютекса _lock. Он хранит состояние ресурсов (подключение к БД, подключение к брокеру сообщений, конфигурация) и предоставляет к ним доступ через методы get_* и set_*.

Другие модули или функции могут получить доступ к экземпляру ResourceContainer так:

def foo():
    container = ResourceContainer()
    db_conn = container.get_db_connection()
    # use db_conn

def bar():
    container = ResourceContainer()
    config = container.get_config()
    # use config


Обратите внимание, что каждый раз при вызове ResourceContainer() будет возвращаться один и тот же экземпляр, таким образом состояние ресурсов будет сохраняться на всем протяжении существования приложения.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы