亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解python實現(xiàn)線程安全的單例模式

 更新時間:2018年03月05日 08:35:57   作者:熔遁丶螺旋手里劍  
這篇文章主要介紹了python實現(xiàn)線程安全的單例模式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

單例模式是一種常見的設(shè)計模式,該模式的主要目的是確保某一個類只有一個實例存在。當(dāng)你希望在整個系統(tǒng)中,某個類只能出現(xiàn)一個實例時,單例對象就能派上用場。

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

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

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中。如果已經(jīng)instances中已經(jīng)存在該類,那么直接返回實例instances[cls]。

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

#!/usr/bin/python
# -*- coding: utf-8 -*-
import threading

def synchronized(func):
 func.__lock__ = threading.Lock()

 def synced_func(*args, **kws):
  with func.__lock__:
   return func(*args, **kws)

 return synced_func

def Singleton(cls):
 instances = {}

 @synchronized
 def get_instance(*args, **kw):
  if cls not in instances:
   instances[cls] = cls(*args, **kw)
  return instances[cls]

 return get_instance

def worker():
 single_test = test()
 print "id----> %s" % id(single_test)

@Singleton
class test():
 a = 1
if __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()

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于Flask+websocket實現(xiàn)一個在線聊天室

    基于Flask+websocket實現(xiàn)一個在線聊天室

    在今天的互聯(lián)網(wǎng)時代,實時通信成為了許多應(yīng)用和服務(wù)的核心特色,在本文中,我們將介紹如何使用 Flask 和 Websockets 通過 Flask-SocketIO 框架創(chuàng)建一個簡單的在線聊天室,感興趣的可以跟隨小編一起了解下
    2023-09-09
  • 在Python中編寫數(shù)據(jù)庫模塊的教程

    在Python中編寫數(shù)據(jù)庫模塊的教程

    這篇文章主要介紹了在Python中編寫數(shù)據(jù)庫模塊的教程,本文代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • Python爬蟲實例——scrapy框架爬取拉勾網(wǎng)招聘信息

    Python爬蟲實例——scrapy框架爬取拉勾網(wǎng)招聘信息

    這篇文章主要介紹了Python爬蟲實例——scrapy框架爬取拉勾網(wǎng)招聘信息的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Python通過Schema實現(xiàn)數(shù)據(jù)驗證方式

    Python通過Schema實現(xiàn)數(shù)據(jù)驗證方式

    這篇文章主要介紹了Python通過Schema實現(xiàn)數(shù)據(jù)驗證方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Python 圖像處理 Pillow 庫詳情

    Python 圖像處理 Pillow 庫詳情

    這篇文章主要介紹了Python 圖像處理 Pillow 庫,圖像處理是常用的技術(shù),python 擁有豐富的第三方擴展庫,Pillow 是 Python3 最常用的圖像處理庫,目前最高版本5.2.0。Python2 使用Pil庫,兩者是使用方法差不多,區(qū)別在于類的引用不同。下面來看看文章的詳細內(nèi)容
    2021-11-11
  • Python?hashlib模塊詳情

    Python?hashlib模塊詳情

    本文,我們來對Python?提供的安全哈希算法的通用接口-hashlib模塊進行學(xué)習(xí),文章內(nèi)容具有一定的參考價值,需要的小伙伴可以參考一下
    2021-11-11
  • PyCharm利用pydevd-pycharm實現(xiàn)Python遠程調(diào)試的詳細過程

    PyCharm利用pydevd-pycharm實現(xiàn)Python遠程調(diào)試的詳細過程

    這篇文章主要介紹了PyCharm利用pydevd-pycharm實現(xiàn)Python遠程調(diào)試,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 用python刪除java文件頭上版權(quán)信息的方法

    用python刪除java文件頭上版權(quán)信息的方法

    在使用他人代碼時,為不保留文件頭部版權(quán)信息,需要一個個刪掉,下面是用python刪除java文件頭上的版權(quán)信息的方法
    2014-07-07
  • Python類的動態(tài)綁定實現(xiàn)原理

    Python類的動態(tài)綁定實現(xiàn)原理

    這篇文章主要介紹了Python類的動態(tài)綁定實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Python 字節(jié)流,字符串,十六進制相互轉(zhuǎn)換實例(binascii,bytes)

    Python 字節(jié)流,字符串,十六進制相互轉(zhuǎn)換實例(binascii,bytes)

    這篇文章主要介紹了Python 字節(jié)流,字符串,十六進制相互轉(zhuǎn)換實例(binascii,bytes),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05

最新評論