多线程 : 生产者消费者模式

生产者消费者问题,是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程---即所谓的“生产者”和“消费者”------在实际运行时会发生的问题生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程消费者也在缓冲区消耗这些数据问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区空时消耗数据。

实现代码如下

'''
--------------------------
    生产者-消费者

    @Copyright:
    @author:
    @date:
'''
#导入多线程模块
import threading
#导入时间模块
import time
#导入随机模块
import random

#使用共享区模拟变量
count = 0
#创建 条件对象
condition = threading.Condition()
#生产者线类
class Praducer(threading.Thread):
    #重写构造方法
    def __init__(self,threadName):
        threading.Thread.__init__(self)
        self.threadName = threadName
        pass
    #重写run()方法
    def run (self):
        global count  #引用全局变量count
        while True:
                #使用条件变量获取锁并锁定
            if condition.acquire():
                #判断共享变量是否达到上限(已满)
                if count >= 10:
                    print("共享区以满,生产者Producer线程进入阻塞Block状态,停止放入!")
                    condition.wait()#当前线程进入到阻塞状态
                else:
                    count += 1 # 共享变量自增1
                    msg = time.ctime()+''+self.threadName+"生产了1件商品放入共享区,共享区商品个数:"
                    print(msg)
                    condition.notify() #唤醒其他阻塞状态的线程(如消费者线程)
                condition.release() #解除锁定
                time.sleep(random.randrange(10)/5)#随机休眠N秒
                pass
            pass
        pass
    pass
#消费者线类
class Customer(threading.Thread):
    def __init__(self,threadName):
        threading.Thread.__init__(self)
        self.threadName = threadName
        pass
    #重run()方法
    def run(self):
        global 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秒
            pass
        pass
    pass

#脚本程序入口
if __name__ == '__main__':
    for i in range(2):
        p = Praducer('生产者-'+str(i+1)+']')
        p.start()
    for i in range(5):
        c = Customer('消费者-'+str(i+1)+']')
        c.start()
        pass
    pass

                                                                                                                   end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值