欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

python的模塊就是天然的單例模式,這里我們使用修飾器來(lái)實(shí)現(xiàn)單例模式,以下是代碼實(shí)現(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

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

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

#!/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()

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

    Python 圖像處理 Pillow 庫(kù)詳情

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

    Python?hashlib模塊詳情

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

    PyCharm利用pydevd-pycharm實(shí)現(xiàn)Python遠(yuǎn)程調(diào)試的詳細(xì)過(guò)程

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

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

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

    Python類(lèi)的動(dòng)態(tài)綁定實(shí)現(xiàn)原理

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

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

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

最新評(píng)論