生产者和消费者模式是多线程开发者经常见到的一种模式,生产者用来生产数据,然后将生成的数据放到中间容器,而消费者这是从中间容器中取出数据进行消费处理。消费者和生产者模式可以让代码达到高内聚低耦合的目的。
import threading
import random
gMoney=0
gLock=threading.Lock()
class Producer(threading.Thread):
def run(self) -> None: #箭头是提示作用,代表返回得内容是none
global gMoney
while True:
gLock.acquire()
money=random.randint(0,100)
gMoney+=money
print('%s生产了%d元'%(threading.current_thread().name,gMoney))
gLock.release()
class Consummer(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:
print('%s想消费%d元,但是余额只有%d元'%(threading.current_thread().name,money,gMoney))
gLock.release()
def main():
for i in range(10):
th=Producer(name='生产者%d号'%i)
th.start()
for i in range(10):
th=Consummer(name='消费者%d号'%i)
th.start()
if __name__ == '__main__':
main()
运行结果:
import threading
import random
gMoney=0
gTime=0
gLock=threading.Lock()
class Producer(threading.Thread):
def run(self) -> None: #箭头是提示作用,代表返回得内容是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.current_thread().name,gMoney))
gLock.release()
class Consummer(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(10):
th=Producer(name='生产者%d号'%i)
th.start()
for i in range(10):
th=Consummer(name='消费者%d号'%i)
th.start()
if __name__ == '__main__':
main()
上述代码,生产者生产10次结束,消费者停止消费的条件,生产够10次或者生产的钱不够消费