Python多线程实战:2生产者3消费者的商品生产消费模式模拟
下面是使用Python多线程实现生产者-消费者模式的示例代码: ```python import threading import time # 商品数量 goods = 0 MAX_GOODS = 10 # 锁对象,用于保护共享资源goods lock = threading.Lock() # 条件变量,用于实现消费者等待商品的条件 condition = threading.Condition(lock) class Producer(threading.Thread): def run(self): global goods for _ in range(MAX_GOODS): with lock: # 如果商品数量已达上限,生产者等待 while goods == MAX_GOODS: condition.wait() goods += 1 print("生产者{}生产了1个商品,当前商品数量:{}".format(self.name, goods)) # 唤醒所有等待商品的消费者 condition.notifyAll() time.sleep(0.5) class Consumer(threading.Thread): def run(self): global goods for _ in range(MAX_GOODS): with lock: # 如果商品数量为0,消费者等待 while goods == 0: condition.wait() goods -= 1 print("消费者{}购买了1个商品,当前商品数量:{}".format(self.name, goods)) # 唤醒所有等待商品的生产者 condition.notifyAll() time.sleep(0.5) # 创建生产者和消费者线程 producers = [Producer() for _ in range(2)] consumers = [Consumer() for _ in range(3)] # 启动线程 for producer in producers: producer.start() for consumer in consumers: consumer.start() # 等待所有线程执行完毕 for producer in producers: producer.join() for consumer in consumers: consumer.join() ``` 上述代码中,使用全局变量`goods`标识商品数量;`MAX_GOODS`表示最大商品数量;`lock`用于保护共享资源`goods`的互斥操作;`condition`用于实现消费者等待商品的条件。 生产者线程(Producer)通过`with lock`语句获取锁,然后判断商品数量是否已达到上限。如果达到上限,则调用`condition.wait()`暂停线程,并释放锁。如果未达到上限,则生产一个商品,输出生产消息,并使用`condition.notifyAll()`唤醒所有等待商品的消费者线程。最后,线程暂停一段时间,模拟生产过程。 消费者线程(Consumer)通过`with lock`语句获取锁,然后判断商品数量是否为0。如果为0,则调用`condition.wait()`暂停线程,并释放锁。如果大于0,则购买一个商品,输出购买消息,并使用`condition.notifyAll()`唤醒所有等待商品的生产者线程。最后,线程暂停一段时间,模拟购买过程。 主程序创建两个生产者线程和三个消费者线程,并启动它们。然后等待所有线程执行完毕。 运行示例代码后,可以看到生产者和消费者线程交替执行,生产者生产商品并唤醒消费者,消费者购买商品并唤醒生产者。当商品数量达到上限或为0时,生产者或消费者会暂停等待。 ######[AI写代码神器 | 1710点数解答 | 2024-11-27 08:37:05]
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)498
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)451
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)443
- 易语言实现高并发 HTTP 操作:多线程、线程池与异步操作实战(字节豆包 | 849点数解答 | 2025-06-03 23:17:33)294
- 易语言多线程启动:如何传递并处理文本数组及注意要点(字节豆包 | 610点数解答 | 2025-08-04 18:05:23)205
- Java调用Python接口中文乱码?设置UTF - 8编码一招解决!(讯飞星火 | 263点数解答 | 2024-06-06 17:07:59)421
- 解决Java调用Python接口中文乱码问题:设置UTF - 8编码全攻略(讯飞星火 | 160点数解答 | 2024-06-06 17:18:39)445
- Java调用Python接口中文乱码问题:字符编码统一解决方案(讯飞星火 | 344点数解答 | 2024-06-06 17:19:55)552
- 解决Java调用Python接口时中文值乱码问题:设置字符编码为UTF-8(讯飞星火 | 264点数解答 | 2024-06-06 17:27:09)418
- 洛谷乒乓球题解:11 分制与 21 分制比赛结果计算全攻略(DeepSeek | 675点数解答 | 2025-04-28 18:19:45)323
- C++ 模拟:助冒险者用神秘数字构建直角三角形,开发要点大揭秘! (DeepSeek | 156点数解答 | 2025-09-14 21:30:10)321
- P1007:小核桃数组变换难题,Python代码揭秘最终平方和!(字节豆包 | 416点数解答 | 2026-02-07 18:24:18)69