Python中的鎖


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM