# lock 生产者和消费者模式
# 先是生产者模式 进行多线程 (完后) 然后储存中间变量 最后 在消费者模式 进行多线程
import threading
import random
gmoney=0
gtime=0
glock=threading.Lock()
class productor(threading.Thread):
def run(self) -> None:
global gmoney
global gtime
while True:
glock.acquire()
if(gtime>10):
glock.release()
break
money=random.randint(0,100)
gmoney+=money
gtime+=1
print('%s 生产了%d元钱' %(threading.currentThread().name,money))
glock.release()
class consumer(threading.Thread):
def run(self) -> None:
global gmoney
while True:
glock.acquire()
money=random.randint(0,100)
if gmoney >= money:
gmoney -= money
print("%s消费了%d元钱"%(threading.current_thread().name,money))
else:
if gtime >= 10:
glock.release()
break
print("%s想消费%d元钱,但是余额只有%d"%(threading.current_thread().name,money,gMoney))
glock.release()
def main():
for i in range(0,5):
th1=productor(name='%d生产者' %i)
th1.start()
for j in range(0,5):
th2=consumer(name='%d消费者' %j)
th2.start()
if __name__ == '__main__':
main()
Lock版本的生产者与消费者模式可以正常的运行。但是存在一个不足,在消费者中,总是通过while True死循环并且上锁的方式去判断钱够不够。上锁是一个很耗费CPU资源的行为。因此这种方式不是最好的。还有一种更好的方式便是使用threading.Condition来实现。threading.Condition可以在没有数据的时候处于阻塞等待状态。一旦有合适的数据了,还可以使用notify相关的函数来通知其他处于等待状态的线程。这样就可以不用做一些无用的上锁和解锁的操作。可以提高程序的性能
#condition 消费者和生产者版本
'''
1. acquire:上锁。
2. release:解锁。
3. wait:将当前线程处于等待状态,并且会释放锁。可以被其他线程使用notify和notify_all函数唤醒。被唤醒后会继续等待上锁,上锁后继续执行下面的代码。
4. notify:通知某个正在等待的线程,默认是第1个等待的线程。
5. notify_all:通知所有正在等待的线程。notify和notify_all不会释放锁。并且需要在release之前调用。
'''
import threading
import random
import time
gmoney=0
gtime=0
gcondition=threading.Condition()
class productor(threading.Thread):
def run(self) -> None:
global gmoney
global gtime
while True:
gcondition.acquire()
if(gtime>10):
gcondition.release()
break
money=random.randint(0,100)
gmoney+=money
gtime+=1
print('%s 生产了%d元钱 剩余%d' %(threading.currentThread().name,money,gmoney))
gcondition.notify_all()
gcondition.release()
time.sleep(1)
class consumer(threading.Thread):
def run(self) -> None:
global gmoney
while True:
gcondition.acquire()
money=random.randint(0,100)
while gmoney < money:
if gtime>=10:
gcondition.release()
return
print('%s 想消费%d 但余额只有%d' %(threading.currentThread().name,money,gmoney))
gcondition.wait()
gmoney -= money
print('%s 消费了%d 剩余%d' %(threading.currentThread().name,money,gmoney))
gcondition.release()
time.sleep(1)
def main():
for i in range(0,5):
th1=productor(name='%d生产者' %i)
th1.start()
for j in range(0,5):
th2=consumer(name='%d消费者' %j)
th2.start()
if __name__ == '__main__':
main()