單例模式
-
在物件導向中,使用單例模式。對例項物件可複用性
-
確保一個類只有一個例項
-
減少記憶體開銷
-
類似於維護一個
全域性變數
的變數 -
如何實現單利模式
__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物件中
-