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