当前位置: 首页 > news >正文

使用Python多线程实现生产者消费者模型

“Talk is cheap, show me the code.”

废话不多说,直接上代码:

"""
生产者消费者模型 Python实现
"""
import queue
import threading
import random
import timeclass ConsProd:# 队列参数_que = None  # 队列# 生产者参数_producer_num = 0  # 生产者数量_prod_block_time = 0.0  # 生产者阻塞时间_prod_work_time = 0.0  # 生产者生产耗时# 消费者参数_consumer_num = 0  # 消费者数量_cons_block_time = 0.0  # 消费者阻塞时间_cons_work_time = 0.0  # 消费者消费耗时def __init__(self, que_size=4, producer_num=4, consumer_num=3, prod_work_time=0.5, cons_work_time=0.3,prod_block_time=1.0, cons_block_time=1.0):self._que_size = que_sizeself._producer_num = producer_numself._consumer_num = consumer_numself._prod_work_time = prod_work_timeself._cons_work_time = cons_work_timeself._prod_block_time = prod_block_timeself._cons_block_time = cons_block_time# 生产者逻辑def __produce(self):while True:if self._que.full():print(f"生产者线程 {threading.currentThread().getName()}: 队列已满,阻塞中...")time.sleep(self._prod_block_time)else:time.sleep(self._prod_work_time)product = random.randint(0, 100)print(f"生产者线程 {threading.currentThread().getName()}: 生产了一个值为 {product} 的数字")self._que.put(product)# 消费者逻辑def __consume(self):while True:if self._que.empty():print(f"消费者线程 {threading.currentThread().getName()}: 队列已空,阻塞中...")time.sleep(self._cons_block_time)else:time.sleep(self._cons_work_time)consumption = self._que.get()print(f"消费者线程 {threading.currentThread().getName()}: 消费了一个值为 {consumption} 的数字")def start(self):# 初始化队列self._que = queue.Queue(self._que_size)# 生产者线程组pro = [threading.Thread(name="prod-" + str(i), target=self.__produce)for i in range(0, self._producer_num)]# 消费者线程组csm = [threading.Thread(name="cons-" + str(i), target=self.__consume)for i in range(0, self._consumer_num)]# 启动所有线程for c in csm:c.start()for p in pro:p.start()if __name__ == "__main__":demo = ConsProd(que_size=16,producer_num=6,consumer_num=4,cons_work_time=0.2,prod_work_time=0.4)demo.start()
http://www.lryc.cn/news/105923.html

相关文章:

  • Notepad++工具通过正则表达式批量替换内容
  • 从零构建深度学习推理框架-3 手写算子relu
  • 想做上位机,学C#还是QT?
  • Ansible —— playbook 剧本
  • ARM寻址方式
  • 【JAVA】String ,StringBuffer 和 StringBuilder 三者有何联系?
  • 关于计数以及Index返回订单号升级版(控制字符长度,控制年月标记)
  • 【计算机网络】11、网桥(bridge)、集线器(hub)、交换机(switch)、路由器(router)、网关(gateway)
  • 第九篇-自我任务数据准备
  • 2023.8.1号论文阅读
  • webpack优化前端框架性能
  • Unity UGUI的Outline(描边)组件的介绍及使用
  • 爆改vue3 setup naiveui可编辑table
  • 功率放大器的种类有哪三种类型
  • HDFS 分布式存储 spark storm HBase
  • Vue3文字实现左右和上下滚动
  • Docker Sybase修改中文编码
  • 【SpringCloud Alibaba】(六)使用 Sentinel 实现服务限流与容错
  • mysql的主从复制
  • 【Golang 接口自动化03】 解析接口返回XML
  • Java+bcprov库实现对称和非对称加密算法
  • 国内最大Llama开源社区发布首个预训练中文版Llama2
  • Qt应用开发(基础篇)——滑块类 QSlider、QScrollBar、QDial
  • 【3-D深度学习:肺肿瘤分割】创建和训练 V-Net 神经网络,并从 3D 医学图像中对肺肿瘤进行语义分割研究(Matlab代码实现)
  • MongoDB文档--架构体系
  • GEE学习03-Geemap配置与安装,arcgis pro自带命令提示符位置等
  • 软件测试面试总结——http协议相关面试题
  • 大数据与okcc呼叫中心融合的几种方式
  • WAF绕过-工具特征-菜刀+冰蝎+哥斯拉
  • 使代码减半的5个Python装饰器