进程_线程 之(五) --- 生产者消费者

同步锁

acquire([timeout])/release():  调用关联的锁的相应方法。 
wait([timeout]):   调用这个方法将使线程进入Condition的等待池等待通知,并释放锁。使用前线程必须已获得锁定,否则将抛出异常。 
notify():   调用这个方法将从等待池挑选一个线程并通知,收到通知的线程将自动调用acquire()尝试获得锁定(进入锁定池);其他线程仍然在等待池中。调用这个方法不会释放锁定。使用前线程必须已获得锁定,否则将抛出异常。 
notifyAll():   调用这个方法将通知等待池中所有的线程,这些线程都将进入锁定池尝试获得锁定。调用这个方法不会释放锁定。使用前线程必须已获得锁定,否则将抛出异常

生产者消费者

1 import threading
2 from time import sleep
3 
4 products = 0 # 定义一个产品变量
5 condition = threading.Condition() # 创建一个同步锁。为了保证生产者在生产过程中,消费者不去消费。不能让消费者去消费还在生产的产品
6 # lock = threading.Lock()
7 # 如果既有读又有写(生产者和消费者模式),不能加互斥锁,容易造成死锁
  • 生产者
 1 # 定于一个生产者类
 2 class Producter(threading.Thread):  # 继承自threading.Thread。重写线程类
 3     ix = [0] # 生产者的实例个数
 4 
 5     def __init__(self,):
 6         super().__init__()
 7         self.ix[0] += 1
 8         self.setName("生成者" + str(self.ix[0]))
 9 
10     def run(self):
11         global products
12         while True:
13             if condition.acquire(): # 加同步锁
14                 if products < 10:
15                     products += 1
16                     print("%s:库存少于10个,努力生产件产品,现在产品的总量为:%d"%(self.getName(),products))
17                 else:
18                     print("%s:库存多于10个,不需要继续生产,现在产品的总量为:%d"%(self.getName(),products))
19                     condition.wait() # 等待一下
20                 condition.release()
21                 sleep(2)
  • 消费者
 1 # 定义一个消费者
 2 class Consumer(threading.Thread):
 3     ix = [0]
 4 
 5     def __init__(self):
 6         super().__init__()
 7         self.ix[0] += 1
 8         self.setName("消费者"+str(self.ix[0]))
 9 
10     def run(self):
11         global products
12         while True:
13             if condition.acquire(): # 加同步锁
14                 if products > 1:
15                     products -= 1
16                     print("%s:我消费了1个产品,现在产品的数量为:%d"%(self.getName(),products))
17                 else:
18                     print("%s:就剩1个产品了,我将停止消费,现在产品的数量为:%d" % (self.getName(), products))
19                     condition.wait() #  锁等一下
20                 condition.release()
21                 sleep(2)
  • 调用
1 if __name__ == '__main__':
2     for _ in range(2):
3         p = Producter()
4         p.start()
5     for _ in range(10):
6         c = Consumer()
7         c.start()
  • 结果
 1 """
 2 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:1
 3 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:2
 4 消费者1:我消费了1个产品,现在产品的数量为:1
 5 消费者2:就剩1个产品了,我将停止消费,现在产品的数量为:1
 6 消费者3:就剩1个产品了,我将停止消费,现在产品的数量为:1
 7 消费者4:就剩1个产品了,我将停止消费,现在产品的数量为:1
 8 消费者5:就剩1个产品了,我将停止消费,现在产品的数量为:1
 9 消费者6:就剩1个产品了,我将停止消费,现在产品的数量为:1
10 消费者7:就剩1个产品了,我将停止消费,现在产品的数量为:1
11 消费者8:就剩1个产品了,我将停止消费,现在产品的数量为:1
12 消费者9:就剩1个产品了,我将停止消费,现在产品的数量为:1
13 消费者10:就剩1个产品了,我将停止消费,现在产品的数量为:1
14 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:2
15 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:3
16 消费者1:我消费了1个产品,现在产品的数量为:2
17 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:3
18 消费者1:我消费了1个产品,现在产品的数量为:2
19 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:3
20 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:4
21 消费者1:我消费了1个产品,现在产品的数量为:3
22 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:4
23 生成者1:库存少于10个,努力生产件产品,现在产品的总量为:5
24 消费者1:我消费了1个产品,现在产品的数量为:4
25 生成者2:库存少于10个,努力生产件产品,现在产品的总量为:5
26 """

 

转载于:https://www.cnblogs.com/TMMM/p/11380501.html

多线程实现生产者与消费者模式 生产者-消费者模式的简介:在实际的软件开发过程中,我们将产生数据的模块称为生产者,处理数据的模块成为消费者。但仅有这两者还不够成为一个生产者-消费者模式,还需要有一个缓冲区(一段内存区域)作为中介,生产者产生的数据放入缓冲区,消费者从缓冲区读取数据并处理。(注:上述所说的模块是广义的,可以是类,函数,线程,进程等)我们可以将这二者之间的关系图表示出来:总结:我们用3-2-1的方法来简单描述一个生产者 阅读详情

相关推荐

进程同步之生产者消费者模型

一、概念引入 例如寄信 我(生产者) 邮递员(消费者) 我把信件写好 -----相当于生产者生产数据 我把信放到邮筒-----相当于把生产者的数据放入到缓冲区 邮递员把信从邮筒取出-----相当于消费者把数据从缓冲区取出 邮递员把信拿去邮局处理------相当于消费者处理数据 ...

HiMark 9078

经典进程同步问题(一)——生产者消费者问题

生产者消费者问题详解(附完整代码)

aimat2020的博客 9445

以生产者/消费者模型为依据,创建一个控制台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。

示例程序源代码: #include<windows.h> #include<fstream.h> #include<stdio.h> #include #include<conio.h> //定义常量; //此程序允许的最大临界区数; #define MAX_BUFFER_NUM 10 //秒到微秒的乘法因子; #define INTE_PER_SEC 1000 //本程序允许的生产和消费线程的总数; #define MAX_THREAD_NUM 64 //定

qq_45367557的博客 2615

详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

1. 利用信号量实现进程的同步和互斥 利用信号量实现进程互斥 为使多个进程能互斥地访问某临界资源,只须为该资 源设置一个互斥信号量 mutex,并设其初始值为 1,然后将各进程访问该资源的临界区 CS 置于 wait(mutex) 和 signal(mutex) 操作之间即可。 在进程互斥中使用 P、V 操作,须在同一程序段成对出 现同一信号量的 P、V 操作,否则会造成系统瘫痪。 注意: 实现互斥的信号量的PV操作必须在同一程序当中成对的出现...

weixin_45951642的博客 6241

编程模拟实现生产者-消费者进程

生产者-消费者问题描述的是:有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能够并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区中;消费者进程可以从一个缓冲区中取走产品去消费。尽管所有的生产者和消费者进程都是以异步方式运行的,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品;也不允许生产者进程向一个已经装满产品的缓冲区中投放产品。

生产者消费者进程

根据生产者消费者的进程进行调度,利用生产者消费者在并发进程中,实现进程的调度策略。

经典的进程同步问题-----生产者-消费者问题详解

经典的进程同步问题-----生产者-消费者问题详解 ​ 本文和接下来几篇博文是对上篇文章(进程同步机制)的一次实践,通过具体的例子来加深理论的理解,会用三个经典的进程同步问题来进行讲解,并且会配有伪代码和Java实践(使用多线程模拟),深入的进行讲解。 ​ 进程同步问题是一个非常重要且相当有趣的问题,因而吸引了很多学者对他进行研究,比如在前几篇博客中提到的老熟人迪杰斯特拉,由此也产生了一系列经典的...

丹丹的后花园 2万+

生产者与消费者进程问题 实验报告

实验目的和要求 目的 1.掌握基本的同步和互斥的算法; 2.掌握生产者和消费者的原理。 要求 用c语言编程搭建“生产者和消费者”经典进程问题的环境。

进程同步问题——生产者—消费者问题

进程同步问题——生产者—消费者问题 问题梗概 生产者—消费者问题是相互合作关系的进程关系的一种抽象,是一个广义的概念,可以代表一类具有相同属性的进程 生产者:一个或者是多个生产者将生产的数据存入缓冲区中,通过in指针操作。 消费者:从缓冲数据中取出数据,通过out指针取出。 缓冲区:被消费者和生产者共享,循环使用,大小为n(存储单元的格数) 图示: 初始化缓冲区,in和out指针指向缓冲区的...

Blackoutdragon的博客 5124

生产者和消费者进程

生产者消费者进程,运用windows编程。这个文件在执行后能够很好的显示出生产者和消费者之间的相互关系。

OSCS开源安全周报第13期:Exchange 高危漏洞公开

OSCS 社区共收录安全漏洞31个,公开漏洞值得关注的是 Apache Commons JXPath 存在代码执行漏洞(CVE-2022-41852),Microsoft Exchange 远程代码执行漏洞(ProxyNotShell(CVE-2022-41040),Apache Tomcat 条件竞争漏洞(CVE-2021-43980),FasterXML jackson-databind 小于2.14.0-rc1拒绝服务漏洞(CVE-2022-42003)。

OSCS开源安全社区 4198

JAVA 操作系统:进程同步机制模拟-生产者消费者问题

用java信号量机制实现生产者消费者进程同步问题

m0_69064777的博客 1392

ANSYS Help USER300

USER 300概述单元描述输入数据假设与限制条件 概述 单元描述 Mechanical APDL提供了一种方便的方法来创建自定义的单元,命名为USER300,可以创建几乎任何单元类型。 UserElem子程序为Mechanical APDL在单元类型创建上提供了一个接口,可传递用户自定义单元创建时所需的所有数据,然后从自定义单元返回所有数据和结果,以更新数据库和文件。因为通过接口可以访问数据库和文件信息,所以很少需要了解Mechanical APDL数据库程序和文件结构。该接口还提供了获取Mechanic

weixin_47019765的博客 2235

java基础语法(三十八)线程和进程(五)——生产者和消费者问题

1、使用wait方法和notify方法实现“生产者和消费者模式” 2、什么是“生产者和消费者模式”? 生产线程负责生产,消费线程负责消费。 生产线程和消费线程要达到均衡。 这是一种特殊的业务需求,在这种特殊的情况下需要使用wait方法称notify方法。 3.、wait和notify方法不是线程对象的方法,是普通java对获都有的方法。 4、wait方法和notify方法建立在线程同步的基础之上。因为多线程要同时操作一个仓库。有线程安全问题。 5、 wait方法作用:o.wait()让正在o对象上活动的线程

Apikaqiu的博客 461

openEuler 欧拉 安装Oracle19c数据库RPM包安装

欧拉系统安装部署oracle 19c rpm方式

陈苏漾的IT生涯 6893

【MNE脑电信号处理学习笔记1】数据的读取、可视化、剪裁、滤波和保存

MNE之读取原始数据、可视化数据、剪裁数据、滤波和保存 Reading & visualizaing raw data, cropping, filtering, and saving 原视频教程:Pybrain: M/EEG analysis with MNE Python 原笔记和材料:pybrain_mne 本文根据视频和个人理解对原笔记进行细微修改。 Import the few packages we’ll need import matplotlib import pathlib i

小白家 4216

采用信号量机制实现消费者与生产者的线程同步_你还能聊聊常用的进程同步算法? 上篇[五]...

点击上方“布衣码农”,免费订阅~选择“设为星标”,第一时间免费获得更新~「布衣码农」进程同步的最佳实践!进程同步回顾进程同步控制有多种方式:算法、硬件、信号量、管程;这些方式可以认为就是同步的工具(方法、函数)。比如信号量机制中的wait(S) 和 signal(S) ,就相当于是两个方法调用。调用wait(S)就会申请这个资源,否则就会等待(进入等待队列);调用signal...

weixin_39996496的博客 364

Aurora8b10b光口通信实战:复位时序与IP核配置详解

本文深入解析了Aurora 8B10B协议在FPGA高速光口通信中的核心实践,重点剖析了确保链路稳定启动的关键复位时序与IP核配置细节。通过详解全双工与单工模式下的复位流程、Vivado中IP核的物理层与链路层参数设置,并结合用户逻辑设计实例,为工程师实现可靠的高速数据传输提供了清晰的实战指南。

weixin_29280219的博客 177

进程的互斥与同步——生产者与消费者问题

实验目的 利用Windows提供的API函数,编写程序,解决生产者与消费者问题,实现进程的互斥与同步。 实验步骤与内容 进程的互斥与同步。编写一段程序,模拟生产者和消费者线程,实现进程的互斥与同步。 利用VC++6.0实现上述程序设计和调试操作,对于生产者和消费者线程操作的成功与否提供一定的提示框。 通过阅读和分析实验程序,熟悉进程的互斥与同步的概念。 主要程序结构及注释 #include&l...

szr712的博客 5737

RT-DETR改进有效系列目录 | 包含卷积、主干、RepC3、注意力机制、Neck上百种创新机制

Hello,各位读者们好Hello,各位读者,距离第一天发RT-DETR的博客已经过去了接近两个月,这段时间里我深入的研究了一下RT-DETR在ultralytics仓库的使用,旨在为大家解决为什么用v8的仓库训练的时候模型不收敛,精度差的离谱的问题,我也是成功的找到了解决方案,对于ultralytics仓库进行多处改进从而让其还原RT-DETR官方的实验环境从而达到一比一的效果。同时本人一些讲解视频和包含我所有创新的RT-DETR文档。

Snu77的博客 3万+

【RT-DETR涨点改进】独家注意力改进篇 | 手把手教你在RT-DETR上使用LSKAttention大核注意力机制(助力目标检测极限涨点)含多种创新改进点

本文提出了一种LSKA大核注意力机制优化RT-DETR模型的方法。LSKA通过将2D深度卷积核分解为级联的1D水平和垂直核,显著降低了计算复杂度和内存占用,尤其在处理大卷积核时优势明显。该模块在图像分类、目标检测等视觉任务中保持与LKA相当的性能,同时展现出更强的鲁棒性。文章详细介绍了LSKA的网络结构、核心代码实现方法,并提供了多种RT-DETR改进方案,包括rtdetr-r18-LSKA、rtdetr-l-LSKA等7种yaml配置文件,通过实验验证了该方法的有效性。

Ai缝合怪、助力小伙伴高效发论文 252

操作系统-进程同步:生产者-消费者问题

​ 以生产者-消费者模型为基础,在Windows环境下创建一个控制台进程(或者界面进程),在该进程中创建读者写者线程模拟生产者和消费者。写者线程写入数据,然后将数据放置在一个空缓冲区中供读者线程读取。读者线程从缓冲区中获得数据,然后释放缓冲区。当写者线程写入数据时,如果没有空缓冲区可用,那么写者线程必须等待读者线程释放出一个空缓冲区。当读者线程读取数据时,如果没有满的缓冲区,那么读入线程将被阻塞,直到新的数据被写进去。​ 实验要求设计并实现一个进程,该进程拥有一个生产者线程和一个

qq_45742603的博客 5170

Android 11.0 app添加校验锁(输入密码才能进入app)

11.0定制化开发中客户要求给app添加锁,就是点击app 图标时,会弹出Dialog,需要输入密码才能进入app中,就是应用校验锁, 最开始想到在Launcher3中实现,但是如果更换了默认Launcher 又不行了 所以最终还是得拦截app启动Activity 从这里入手了 Launcher与APP是在两个不同的进程中,他们之间的通信是通过Binder完成的,点击Launcher上的某个APP,这时会调用Launcher的startActivitySafely方法。 public boolean sta

安卓兼职framework和app工程师的博客 1952

Python 实现生产者-消费者问题(进程、线程、协程)

Python 实现生产者-消费者问题生产者-消费者问题详解Python 多线程Python 套接字 生产者-消费者问题详解 Python 多线程 Python 套接字

Bcdfxg的博客 3802

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【Java】进程同步问题——生产者、消费者问题

进程同步问题——生产者、消费者问题在这里插入图片描述       生产者、消费者问题是操作系统中个著名的进程同步问题。一般是指: 有一群生产者进程在生产产品,并将此产品提供给消费者进程去消费。为使生产者进程和消费者进程能并发执行,在它们之间设置一个缓冲区, 生产者进程可将它所产的产品放入一个缓冲区中,消费者进程可从一个缓冲区取得一个产品消...

Veni的博客 3795

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: 爬与反爬
下一篇: 进程_线程 之(六) --- 协程
baoding4359
博客等级 码龄11年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值