如何在多个 django 应用程序中使用单例实例

Posted

技术标签:

【中文标题】如何在多个 django 应用程序中使用单例实例【英文标题】:how to use a singleton instance in multiple django apps 【发布时间】:2021-08-08 19:18:41 【问题描述】:

我正在使用 django 框架创建一个网站。 我在一个 django 应用程序中使用单例,并使用它来存储一些变量。 现在我已经在我的项目中创建了另一个应用程序,如何将数据从我的单例导入到新应用程序中。

class SingleInstanceMetaClass(type):
    def __init__(self, name, bases, dic):
        self.__single_instance = None
        super().__init__(name, bases, dic)

    def __call__(cls, *args, **kwargs):
        if cls.__single_instance:
            return cls.__single_instance
        single_obj = cls.__new__(cls)
        single_obj.__init__(*args, **kwargs)
        cls.__single_instance = single_obj
        return single_obj

class MyClass(metaclass=SingleInstanceMetaClass):
    def __init__(self):
        self.df = None
        self.del_var = None
        self.quali_col = None
        self.quanti_col = None
        self.target_var = None
        self.date_col = None

这就是我的项目在没有其他 django 文件(模型、url、...)的情况下的样子

Project 
    Description
        -views.py
    Transformation
        -views.py 

【问题讨论】:

【参考方案1】:

第一件事:单身人士不需要元类 - 只需这样做:

class MyClass(metaclass=SingleInstanceMetaClass):
    def __init__(self):
        self.df = None
        self.del_var = None
        self.quali_col = None
        self.quanti_col = None
        self.target_var = None
        self.date_col = None
    def __call__(self):
        return self

MyClass = MyClass()

这将创建一个实例,并通过对类的引用:任何尝试导入或使用 MyClass 的人都只会获得它所创建的唯一实例,这种微不足道的事情不需要元类黑魔法。

现在,请回答您的问题,MyClass 单个实例将可用于您的项目,就像任何其他命名的 Python 对象一样 - 只需使用其他应用程序中的合格导入语句即可,例如:

 from project.transformation.views import MyClass

现在,请注意一件事:在生产环境中,django 项目可以有多进程工作人员 - 在这种情况下,每个工作人员都有一个单独的实例。 (如果您的生产 WSGI 服务器配置为仅使用多线程,您将获得一个实例)。

在这种情况下,如果您真的想在所有工作人员之间共享“myclass”中的所有属性,您需要一个更复杂的设置,结合属性和多进程数据通信原语,如multiprocessing.Value。 而且,如果您的生产设置将用于水平扩展,并且在不同的服务器中处理进程,那将无法正常工作 - 您将需要设置一个键/值服务(如 redis 实例)以在所有工作人员之间同步这些属性。

【讨论】:

以上是关于如何在多个 django 应用程序中使用单例实例的主要内容,如果未能解决你的问题,请参考以下文章

Java设计模型-五种单例模型

使用 TPL 在多个不同线程上创建单例对象

单例模式

CMMotionManager 的多个实例,确定更新间隔

单例模式以及在android中的使用

单例模式以及在android中的使用