代码改变世界

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 ()