您好,登錄后才能下訂單哦!
使用Flask框架怎么實(shí)現(xiàn)單例模式?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
單例模式:
程序運(yùn)行時(shí)只能生成一個(gè)實(shí)例,避免對(duì)同一資源產(chǎn)生沖突的訪問(wèn)請(qǐng)求。
Django admin.py下的admin.site.register() , site就是使用文件導(dǎo)入方式的單例模式
創(chuàng)建到單例模式4種方式:
1.文件導(dǎo)入
2. 類(lèi)方式
3.基于__new__方式實(shí)現(xiàn)
4.基于metaclass方式實(shí)現(xiàn)
1.文件導(dǎo)入:
in single.py
class Singleton(): def __init__(self): pass site = Singleton()
類(lèi)似:
import time 第一次已經(jīng)把導(dǎo)入的time模塊,放入內(nèi)存
import time 第二次內(nèi)存已有就不導(dǎo)入了
in app.py
from single.py import site #第一次導(dǎo)入,實(shí)例化site對(duì)象并放入內(nèi)存
in views.py
from single.py import site #第二次導(dǎo)入,直接從內(nèi)存拿。
2.類(lèi)方式:
缺點(diǎn):改變了單例的創(chuàng)建方式
obj = Singleton.instance()
# 單例模式:無(wú)法支持多線程情況 import time class Singleton(object): def __init__(self): import time time.sleep(1) @classmethod def instance(cls, *args, **kwargs): if not hasattr(Singleton, "_instance"): Singleton._instance = Singleton(*args, **kwargs) return Singleton._instance # # 單例模式:支持多線程情況 import time import threading class Singleton(object): _instance_lock = threading.Lock() def __init__(self): time.sleep(1) @classmethod def instance(cls, *args, **kwargs): if not hasattr(Singleton, "_instance"): with Singleton._instance_lock: if not hasattr(Singleton, "_instance"): Singleton._instance = Singleton(*args, **kwargs) return Singleton._instance
3.基于__new__方式實(shí)現(xiàn):
單例創(chuàng)建方式:
obj1 = Singleton() obj2 = Singleton()
import time import threading class Singleton(object): _instance_lock = threading.Lock() def __init__(self): pass def __new__(cls, *args, **kwargs): if not hasattr(Singleton, "_instance"): with Singleton._instance_lock: if not hasattr(Singleton, "_instance"): Singleton._instance = object.__new__(cls, *args, **kwargs) return Singleton._instance
4.基于metaclass方式實(shí)現(xiàn)
基于metaclass方式實(shí)現(xiàn)的原理:
1.對(duì)象是類(lèi)創(chuàng)建,創(chuàng)建對(duì)象時(shí)候類(lèi)的__init__方法自動(dòng)執(zhí)行,對(duì)象()執(zhí)行類(lèi)的 __call__ 方法
2.類(lèi)是type創(chuàng)建,創(chuàng)建類(lèi)時(shí)候type的__init__方法自動(dòng)執(zhí)行,類(lèi)() 執(zhí)行type的 __call__方法
單例創(chuàng)建方式:
obj1 = Foo() obj2 = Foo()
import threading class SingletonType(type): _instance_lock = threading.Lock() def __call__(cls, *args, **kwargs): if not hasattr(cls, "_instance"): with SingletonType._instance_lock: if not hasattr(cls, "_instance"): cls._instance = super(SingletonType,cls).__call__(*args, **kwargs) return cls._instance class Foo(metaclass=SingletonType): def __init__(self): pass
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。