国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

詳解python實現線程安全的單例模式

2020-02-22 23:22:14
字體:
來源:轉載
供稿:網友

單例模式是一種常見的設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當你希望在整個系統中,某個類只能出現一個實例時,單例對象就能派上用場。

比如,服務器的配置信息寫在一個文件中online.conf中,客戶端通過一個 Config 的類來讀取配置文件的內容。如果在程序運行期間,有很多地方都需要使用配置文件的內容,那么每個調用配置文件的地方都會創建 Config的實例,這就導致系統中存在多個Config 的實例對象,在配置文件內容很多的情況下,我們就浪費了大量的內存做了同樣的事。事實上,對于Config類我們在程序運行期間時只需要一個實例對象即可,這時單例模式就是最好的選擇。

python的模塊就是天然的單例模式,這里我們使用修飾器來實現單例模式,以下是代碼實現

def Singleton(cls): instances = {} def get_instance(*args, **kw):  if cls not in instances:   instances[cls] = cls(*args, **kw)  return instances[cls] return get_instance

代碼也很簡單,將類傳入單例修飾器中,如果該類還未生成實例(instances中不存在該類),那么就生成一個新的實例返回,并記錄在instances中。如果已經instances中已經存在該類,那么直接返回實例instances[cls]。

那么這段代碼是完美的嗎?答案是否定的,這段代碼不是線程安全的。要實現線程安全需要配合鎖的使用,只有占有鎖的線程才能繼續訪問單例實例,看來我們需要再寫一個修飾器來實現線程安全了,以下是完整的代碼實現和簡單的多線程測試用例。

#!/usr/bin/python# -*- coding: utf-8 -*-import threadingdef synchronized(func): func.__lock__ = threading.Lock() def synced_func(*args, **kws):  with func.__lock__:   return func(*args, **kws) return synced_funcdef Singleton(cls): instances = {} @synchronized def get_instance(*args, **kw):  if cls not in instances:   instances[cls] = cls(*args, **kw)  return instances[cls] return get_instancedef worker(): single_test = test() print "id----> %s" % id(single_test)@Singletonclass test(): a = 1if __name__ == "__main__": task_list = [] for one in range(30):  t = threading.Thread(target=worker)  task_list.append(t) for one in task_list:  one.start() for one in task_list:  one.join()

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林站長站。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 疏勒县| 九龙城区| 徐水县| 平定县| 广灵县| 宁安市| 平谷区| 祁阳县| 体育| 呼伦贝尔市| 本溪市| 双峰县| 微山县| 安龙县| 武穴市| 万源市| 来宾市| 湄潭县| 沂水县| 秦皇岛市| 奈曼旗| 根河市| 兴山县| 永清县| 大英县| 馆陶县| 章丘市| 旬邑县| 阳城县| 平潭县| 上蔡县| 钟祥市| 肥东县| 文登市| 多伦县| 威远县| 永平县| 高密市| 于田县| 象山县| 苍溪县|