注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

osdba的博客

敢于担当,拥抱变化,锐意进取,永不止步

 
 
 

日志

 
 

python中实现的一个对象锁  

2013-03-20 20:42:18|  分类: python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
我们在日常生活中,需要访问一些不能并发操作的对象,这时就需要在这个对象上加一个锁,另一个线程再访问这个对象时,就需要等待。这有点象数据库中的行锁,有一个人需要修改一行时,需要对这一行加锁,修改完后,释放锁。

#!/usr/bin/env python
# _*_ coding:UTF-8


import threading
import time
import random

class ObjectLock():
'''对象锁,在一个对象上加锁或释放锁,实现对一个对象访问的串行化'''

def __init__(self):
self.cond = threading.Condition()
self.objSet = set()

def lock(self, obj):
'''在obj上加锁'''

self.cond.acquire()
while obj in self.objSet:
self.cond.wait()
self.objSet.add(obj)
self.cond.release()

def unLock(self, obj):
'''释放obj上的锁'''

self.cond.acquire()
self.objSet.remove(obj)
self.cond.notifyAll()
self.cond.release()


class MyThread(threading.Thread):

def __init__(self, tid, oLock):
threading.Thread.__init__(self)
self.tid = tid
self.oLock = oLock

def run(self):
while True:
vol = random.randint(1,3)
self.oLock.lock(vol)
print "thread %d: process %d begin" % (self.tid, vol)
time.sleep(4)
print "thread %d: process %d end" % (self.tid, vol)
self.oLock.unLock(vol)

oLock = ObjectLock()
for i in range(10):
t = MyThread(i, oLock)
t.start()

本文实现了一种对象锁类:ObjectLock
如果想对一个对象加锁则:
objLock.lock(obj)
对一个对象释放锁则:
objLock.unLock(obj)

代码中MyThread类及后面的代码都是测试代码。线程随机产生1,2,3其中的一个数字,代表一个对象。当操作数字1代表的对象时,调用self.aLock.lock(vod)加锁,这样别外的线程如果也处理1时,就会被阻塞。
  评论这张
 
阅读(485)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017