免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: zhuyubei

非多线程环境下,如何锁住dict [复制链接]

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
发表于 2012-08-17 15:38 |显示全部楼层
本帖最后由 cdtits 于 2012-08-17 16:41 编辑

回复 9# Hadron74
  1. class myUserDict(UserDict):

  2.     def __init__(self, dict = None, lock = False, **kwarg):
  3.         self._lock = lock
  4.         self._error = False
  5.         UserDict.__init__(self, dict, **kwarg)

  6.     def lockit(self):
  7.         self._lock = True

  8.     def unlockit(self):
  9.         self._lock = False

  10.     def _isUnlocked(self):
  11.         if self._lock:
  12.             if self._error:
  13.                 raise ValueError("The Dict is locked")
  14.             return False
  15.         return True

  16.     def __setitem__(self, key, item):
  17.         if self._isUnlocked():
  18.             return UserDict.__setitem__(self, key, item)
复制代码

论坛徽章:
0
发表于 2012-08-17 15:47 |显示全部楼层
回复 11# cdtits

再包装一下,不错。谢谢!
   

论坛徽章:
0
发表于 2012-08-17 15:51 |显示全部楼层
回复 11# cdtits


    不错啊。哈哈

论坛徽章:
0
发表于 2012-08-18 10:27 |显示全部楼层
本帖最后由 106033177 于 2012-08-18 10:28 编辑

回复 13# zhuyubei
回复 11# cdtits
  1. class mydict(dict):
  2.     def __init__(self,**kwarg):
  3.         self._lock = False
  4.         dict.__init__(self,**kwarg)
  5.     @property
  6.     def islocked(self):
  7.         return self._lock
  8.     @islocked.setter
  9.     def islocked(self,value):
  10.         self._lock = value
  11.     def __setitem__(self, key, item):
  12.         if not self._lock :
  13.             return dict.__setitem__(self, key, item)
  14.         raise ValueError("dict is locked")
  15.    
  16. a = mydict(one=1,two=2)
  17. a['three'] = 3
  18. print a
  19. a.islocked=True
  20. a['four']=5
复制代码

论坛徽章:
0
发表于 2012-09-12 11:41 |显示全部楼层
回复 14# 106033177
回复 11# cdtits
回复 1# zhuyubei
刚学了函数修饰符的的使用,试着改写了先前写的程序,是精简了一些,但是面向对象不太好,多了个全局函数,让高手看看,有什么建议。
  1. from UserDict import UserDict

  2. def public_lock(func):
  3.         def newfunc(self,*argv,**kwarg):
  4.                 if self.lock:
  5.                         raise ValueError("The Dict is locked")
  6.                 else:
  7.                         return func(self,*argv,**kwarg)
  8.         return newfunc

  9. class myUserDict(UserDict):
  10.         def __init__(self,dict=None,lock=False,**kwarg):
  11.                 self.lock = lock
  12.                 UserDict.__init__(self,dict,**kwarg)
  13.         def lockit(self):
  14.                 self.lock = True
  15.         def unlockit(self):
  16.                 self.lock =False

  17.         @public_lock
  18.         def __setitem__(self,key,item):
  19.                 return UserDict.__setitem__(self,key,item)

  20.         @public_lock
  21.         def __delitem__(self,key):
  22.                 return UserDict.__delitem__(self,key)

  23.         @public_lock
  24.         def update(self,dict=None,**kwarg):
  25.                 return UserDict.update(self,dict,**kwarg)

  26.         @public_lock
  27.         def setdefault(self,key,failobj=None):
  28.                 return UserDict.setdefault(self,key,failobj)

  29.         @public_lock
  30.         def pop(self,key,*args):
  31.                 return UserDict.pop(self,key,*args)

  32.         @public_lock
  33.         def popitem(self):
  34.                 return UserDict.popitem(self)

  35. if __name__ == '__main__':
  36.         a=myUserDict({1:1,2:2,3:3})
  37.         print a
  38.         a.lockit()
  39.         a[4] = 5
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP