Lock版本:
#其实生产者和消费者都是要修改公共资源的
#但是消费者,要在生产者修改过公共资源后,才能处理公共资源,
#生产者生产后,就等着消费者处理完,生产者再修改数据.
import threading
import random
import time
gMoney=0
gLock=threading.Lock()
def producer():
global gMoney
while True:
money=random.randint(100,1000)
gLock.acquire()
gMoney+=money
print("%s生产了%d,现在共有%d元钱"%(threading.current_thread(),money,gMoney))
gLock.release()
time.sleep(2)
def consumer():
global gMoney
while True:
money=random.randint(100,1000)
gLock.acquire()
if money<gMoney:
gMoney-=money
print("%s消费了%d,剩下%d元钱" % (threading.current_thread(), money, gMoney))
gLock.release()
time.sleep(1)
def main():
for i in range(5):
t=threading.Thread(target=producer)
t.start()
for x in range(5):
t=threading.Thread(target=consumer)
t.start()
if __name__ == '__main__':
main()
Condition版本:
#Lock版本中上锁,放锁比较费时间
#在本版本种中如果不满足生产条件,处于阻塞状态
#wait:将当前线程处于阻塞状态,并且释放锁
#notify:默认唤醒第一个正在等待的线程,不会立刻释放锁
#notify_all:唤醒所有等待的线程,不会释放锁,和notify都要放在releas函数前面
'''关于等待唤醒机制,可以理解为线程可以执行有两个条件:
有争取执行权的资格 and 争取到执行权,'
一个没有争取执行权资格的线程 不能 争取执行权.
wait就是让本线程放弃争取的资格,如果有锁就释放掉,
notify就是重新给该线程争取的资格'''
import threading
import random
import time
gMoney=0
gCondition=threading.Condition()
def producer():
global gMoney
while True:
money=random.randint(100,1000)
gCondition.acquire()
gMoney+=money
print("%s生产了%d,现在共有%d元钱"%(threading.current_thread(),money,gMoney))
gCondition.notify_all()
gCondition.release()
time.sleep(2)
def consumer():
global gMoney
while True:
money=random.randint(100,1000)
gCondition.acquire()
while money>gMoney:
gCondition.wait()
gMoney-=money
print("%s消费了%d,剩下%d元钱" % (threading.current_thread(), money, gMoney))
gCondition.release()
time.sleep(1)
def main():
for i in range(5):
t=threading.Thread(target=producer)
t.start()
for x in range(5):
t=threading.Thread(target=consumer)
t.start()
if __name__ == '__main__':
main()