消费者与生产者(记笔记)

# 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()
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页