生产者与消费者问题(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()   #启动消费者线程


生产者-消费者问题是一个经典的同步问题,主要涉及到多个线程之间的协作和资源竞争。在Python中,可以使用`threading`模块来实现生产者-消费者问题。 以下是一个简单的生产者-消费者问题Python实现: ```python import threading import time import random # 共享资源,初始为 resource = None # 条件变量 condition = threading.Condition() # 生产者线程函数 def producer(): global resource while True: # 获取锁 condition.acquire() # 如果资源不为,等待消费者消费 while resource is not None: condition.wait() # 生产资源 resource = random.randint(1, 100) print("生产者生产了一个资源:", resource) # 通知消费者消费 condition.notify() # 释放锁 condition.release() # 等待一段间 time.sleep(random.random()) # 消费者线程函数 def consumer(): global resource while True: # 获取锁 condition.acquire() # 如果资源为,等待生产者生产 while resource is None: condition.wait() # 消费资源 print("消费者消费了一个资源:", resource) resource = None # 通知生产者生产 condition.notify() # 释放锁 condition.release() # 等待一段间 time.sleep(random.random()) # 创建生产者线程和消费者线程 p = threading.Thread(target=producer) c = threading.Thread(target=consumer) # 启动线程 p.start() c.start() # 等待线程结束 p.join() c.join() ``` 在上面的代码中,我们使用了一个共享变量`resource`表示生产者生产的资源,使用了一个条件变量`condition`来协调生产者消费者之间的同步。在生产者线程中,如果资源不为,就等待消费者消费;如果资源为,就生产一个资源并通知消费者。在消费者线程中,如果资源为,就等待生产者生产;如果资源不为,就消费掉资源并通知生产者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值