生产者和消费者问题

        生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。

        该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。

        生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。 消费者也在缓冲区消耗这些数据。

        该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

 

代码:

#_*_coding:utf-8 _*_
'''
ch04-demo06-customer.py
----------------------
生产者-消费者
@Copyright:Chinasoft International.ETC
@author:Alvin
@data:2018-04-24
'''

#导入多线程模块
import threading
#倒入时间模块
import time
#导入随机模块
import random
#使用共享区模拟变量
count=0
#创建条件对象
condition = threading.Condition()
#生产者线程类
class Producer(threading.Thread):
    #重写构造方法
    def __init__(self,threadName):
        threading.Thread.__init__(self)
        self.threadName=threadName
    #重写run()方法
    def run(self):
        global count  #引用全局共享变量count
        while True:
            #使用条件对象获取锁并锁定
            if condition.acquire():
                #判断共享变量是否已达上限
                if count>=0:
                    print('共享区已满,生产者producer线程进入阻塞Block状态,停止放入!')
                    condition.wait()#当前线程进入阻塞状态
                else:
                    count +=1 #共享变量自增1
                    msg = time.ctime()+""+self.threadName+'生产了1件商品放入共享区,共享区总计商品个数:'+str(count)
                    print(msg)
                    condition.notify()#唤醒其他阻塞状态的线程(如,消费者线程)
                condition.release()#解除锁定
                time.sleep(random.randrange(10)/5)#随机休眠N秒
                #消费者线程
                class Customer(threading.Thread):
                    #重写构造方法
                    def __init__(self,threadName):
                        threading.Thread.__init__(self)
                        self.threadName =threadName
                        #重写run()方法
                        def run(self):
                            global count #引用全局共享变量count
                            while True:
                                #使用条件对象获取锁并锁定
                                if condition.acquire():
                                    #判断共享变量是否已为0
                                    if count<1:
                                        print('共享区已空,消费者Customer线程进入阻塞Block状态,停止获取!')
                                        condition.wait() #当前线程进入阻塞状态
                                    else:
                                        count -=1#共享变量自减1
                                        msg = time.ctime()+''+self.threadName+'消费了1件商品,共享区总计商品个数:'+str(count)
                                        print(msg)
                                        condition.notify()  # 唤醒其他阻塞状态的线程(如,消费者线程)
                                    condition.release()  # 解除锁定
                                    time.sleep(random.randrange(10))  # 随机休眠N秒
                                    #脚本程序入口
                                    if __name__ == '__main__':
                                        for i in range(2):
                                            p=Producer('[生产者-'+str(i+1)+']')
                                            p.start()
                                        for i in range(5):
                                            c = Producer('[消费者-' + str(i + 1) + ']')
                                            c.start()

 

结果如下图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值