Python中的锁
2013-07-29 17:29 江湖么名 阅读(5627) 评论(0) 编辑 收藏 举报先用thread模块的Lock锁来实现生产者消费者问题,
Lock对象是Python提供的低级线程控制工具,使用起来非常简单,只需下面3条语句即可:
thread.allocate_lock() | 返回一个新Lock对象,即为一个新锁 |
lock.acquire() | 相当于P操作,得到一个锁 |
lock.release() | 相当于V操作,释放一个锁 |
lock.locked() | 已经得到了锁,返回True(一般用不到) |
1 import thread,time,random 2 dish = 0 #需要放在安全区的变量 3 lock = thread.allocate_lock () 4 def producerFunction() : 5 '''如果投的筛子比0.2大,则向盘子中增加一个苹果''' 6 global lock, dish 7 while True: 8 if ( random.random() > 0.1 ): 9 lock.acquire() # 从这里进入线程安全区 10 if dish < 100: 11 dish += 1 12 msg = '生产者增加了一个苹果,现在有 %d 个苹果' % (dish) 13 print ( msg.decode ('utf-8') ) 14 lock.release() # 从这里离开线程安全区 15 time.sleep (random.random()*3) 16 17 def consumerFunction() : 18 '''如果投的筛子比0.5大,则从盘子中取一个苹果''' 19 global lock, dish 20 while True: 21 if ( random.random() > 0.9 ): 22 lock.acquire() # 从这里进入线程安全区 23 if dish > 0: 24 dish -= 1 25 msg = '消费者拿走一个苹果现,在有%d个苹果' % (dish) 26 print (msg.decode('utf-8')) 27 lock.release() # 从这里离开线程安全区 28 time.sleep (random.random()*3) 29 30 def begin_test_lock(): 31 ident1 = thread.start_new_thread ( producerFunction, () ) 32 ident2 = thread.start_new_thread ( consumerFunction, () ) 33 time.sleep(60) 34 def main (): 35 begin_test_lock () 36 if __name__ == '__main__' : 37 main ()