Python中實現單例模式

染指未来發表於2024-04-17

單例模式

  • 在物件導向中,使用單例模式。對例項物件可複用性

  • 確保一個類只有一個例項

  • 減少記憶體開銷

  • 類似於維護一個全域性變數的變數

  • 如何實現單利模式

    • __new__ 實現單利模式
    • python 檔案匯入 實現單利模式
    • 多執行緒 對 單利物件 上鎖
  • 使用場景

    • python 檔案匯入,也可實現單利模式

      # from 和 import 匯入一次後。不再匯入第二次
      得到的logger 物件就是一個 單利物件,不會建立第二個
      
    • 資料庫連線池

    • 頻繁建立物件場景

    • 執行緒池

      • 多執行緒遇到 IO 阻塞時,會造成重新 例項化物件。 解決辦法:對建立物件的函式 __new__方法 上鎖🔒

        # -*-coding:utf-8-*-
        # 多執行緒時,需要對物件建立函式。上鎖
        import threading
        import time
        
        
        class Singleton(object):
            instance = None
            lock = threading.Lock()
        
            def __init__(self, i):
                self.i = i
        
            def __new__(cls, *args, **kwargs):
                # 如果有例項物件,直接返回
                if cls.instance:
                    return cls.instance
                # 上鎖。阻止IO阻塞,執行緒被掛起
                with cls.lock:
                    if not cls.instance:
                        time.sleep(1) # 模擬執行緒阻塞
                        cls.instance = object.__new__(cls)
                    return cls.instance
        
        
        def task(args):
            obj = Singleton(args)
            print(obj)
        
        
        for i in range(10):
            thread = threading.Thread(target=task, args=(i,))
            thread.start()
        
        time.sleep(10)
        return_obj = Singleton(1)
        print("return_obj:", return_obj)
        
        
    • 日誌檔案 物件

    • 網站計數器

    • django 使用到單例模式

      • django-admin的admin.site.register()。 將model註冊到 Register物件的字典中
      • 配置檔案 settings。 將全域性配置gloabl_setting 和 自定義配置匯入 ,django web物件中

相關文章