python синглетон __init__ вызывается и более одного раза - PullRequest
0 голосов
/ 16 апреля 2020

Я реализовал этот потокобезопасный синглетон:
https://gist.github.com/werediver/4396488

class Singleton(type):
    _instances = {}
    _singleton_lock = threading.Lock()


    def __call__(cls, *args, **kwargs):
        # double-checked locking pattern (https://en.wikipedia.org/wiki/Double-checked_locking)
        if cls not in cls._instances:
            with cls._singleton_lock:
                if cls not in cls._instances:
                    cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

- реализация синглетона

class ConfigManager(metaclass=Singleton):
  data = None
    def __init__(self):
        self.data = "2222"

теперь, когда в моем Основное приложение (flask) У меня есть импорт, который выглядит следующим образом:

-- main.py
import dbmanager
//Load second 
from config_manager import ConfigManager

//Load first 
-- dbmanager.py
from config_manager import ConfigManager

, как вы заметили, dbmanager.py сначала загружает ConfigManager, который является одиночным, а затем main.py загружает ConfigManager

проблема в том, что они оба заходят в ConfigManager init (самостоятельно)
и создают 2 экземпляра ConfigManager в памяти

. Это невозможно для однократного ввода в ConfigManager init (самостоятельно)?

ОБНОВЛЕНИЕ
я нашел этот sulotion:
проблема с синглтоном python вызов два раза __init __

, который мешает получить доступ к __init(self)__ при импорте, но я должен реализовать его в каждом классе, как я могу реализовать его в моем примере, чтобы я мог использовать его в качестве метакласса?

это работает, но уродливо, как реализовать это в версии метакласса?

class ConfigManager():

    __instance = None
    def __new__(cls):
        if cls.__instance is None:
            cls.__instance = super(ConfigManager, cls).__new__(cls)
            cls.__instance.__initialized = False
        return cls.__instance

    def __init__(self):
        if (self.__initialized): return
        self.__initialized = True

        self.data = "2222"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...