多进程或多线程访问共享数据时,往往需要在业务层控制锁,增加脑力负担。这里设计了一个通用的方法,将锁操作直接封装在数据结构中。直接贴代码#!/usr/bin/envpython#encoding:utf-8frommultiprocessingimportLock,RLockdefmake_property(name):try:returnprop_cache[name]exceptKeyError:d={}exec(template%((name,)*7),d)prop_cache[name]=d[name]returnd[name]template='''defget%s(self):self.acquire()try:returnself._obj.%s最后:self.release()defset%s(self,value):self.acquire()try:self._obj.%s=value最后:self.release()%s=property(get%s,set%s)'''prop_cache={}classSynchronizedBase(object):def__init__(self,obj,lock=None):self._obj=objiflock:self._lock=lockelse:self._lock=RLock()self.acquire=self._lock.acquireself.release=self._lock.releasedef__enter__(self):返回self._lock.__enter__()def__exit__(self,*args):返回self._lock.__exit__(*args)defget_obj(self):返回self._objdefget_lock(self):returnself._lockdef__repr__(self):return'<%swrapperfor%s>'%(type(self).__name__,self._obj)class同步(SynchronizedBase):value=make_property('value')classObj(object):def__init__(self,value):self.value=valuedefSafeObj(obj,lock=None):returnSynchronized(obj,lock)if__name__=='__main__':a=SafeObj(Obj(3))b=SafeObj(Obj(4),Lock())print(a.value)print(b.value)SafeObj包装Obj并返回一个同步Sincetheprimitiveobject足够抽象,其访问行为与Obj一致。代码也可以扩展,比如Synchronized如何访问Obj的方法等。
