生产者与消费者问题(python)

本文详细介绍了使用Python的threading模块实现的生产者与消费者模型。通过实例代码,展示了如何利用条件变量condition来同步多个线程,确保生产者和消费者能够正确地交互,避免资源竞争和死锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生产者与消费者问题(python)

其主要是针对多线程threading问题的实际场景

生产者消费者模型:

生产者------> 缓存<-------- 消费者

具体代码详解如下:
import threading
import time
import random

count=0  #使用共享区的模拟变量
condition = threading.Condition()

class Producer(threading.Thread):    #使创建的类继承threading.Thread

    def __init__(self,threadName):    #重写其构造方法
        threading.Thread.__init__(self)
        self.threadName = threadName

    def run(self):
        global count  #引入全局变量
        while True:
            if condition.acquire():     #使用条件对象获取锁并锁定
                if count>=10:           #判断是否超过上限
                    print('共享区已满,生产者Producer进入阻塞状态,停止放入!')
                    condition.wait()    #使当前进程进入阻塞状态
                else:
                    count += 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

    def run(self):
        global count
        while True:
            if condition.acquire():
                if count<1:
                    print("共享区为空,消费者Customer线程进入阻塞状态,停止获取!")
                    condition.wait()  #当前进程进入阻塞状态
                else:
                    count -= 1
                    msg=time.ctime()+' '+self.threadName + '消费了1件商品,共享区总计商品个数为:'+str(count)
                    print(msg)
                    condition.notify() #唤醒其他阻塞线程
                condition.release()  #解除锁定
                time.sleep(random.randrange(10)/2) #随即休眠n秒

if __name__ == "__main__":
    for i in range(2):
        p = Producer('[生产者-'+str(i+1)+']')
        p.start()   #启动生产者线程

    for i in range(5):
        c = Customer('[消费者-'+str(i+1)+']')
        c.start()   #启动消费者线程


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值