操作系统OS,Python - 生产者消费者模型
1. 缓冲区(此处用阻塞队列充当),解决消费者和生产者强耦合问题。(生产者和消费者不直接通信)
2. 通过平衡生产者线程和消费者线程,来提高程序整体处理数据速度。
3. 在并发编程中该模式能解决大多数并发问题。
4. 例子1. 生产者生产一次,每个消费者消费一次
import threading
import queue
import time
def producer():
for i in range(10):
q.put("饺子 %s" % i )
print("开始等待所有的饺子被取走...")
#把操作队列的线程join到生产者线程,待这些线程结束后,生产者线程再往下执行。
q.join()
print("所有的饺子被取完了...")
def consumer(n):
while q.qsize() >0:
print("%s 取到" %n , q.get())
q.task_done()
time.sleep(1)
q = queue.Queue()
p1 = threading.Thread(target=producer,)
p1.start()
p2 = threading.Thread(target=consumer, args=('Allen1',))
p2.start()
p3 = threading.Thread(target=consumer, args=('Allen2',))
p3.start()
5. 例子2. 生产者和消费者动态生成或者消费
知识点:
- 临界区(加锁解锁)
- 缓冲区(本例为阻塞队列)
- 生产者,消费者同步
import time,random
import queue,threading
#缓冲区用阻塞队列实现
q = queue.Queue()
#临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性
#生成全局锁,对缓冲区这个共享资源(临界资源)进行加锁解锁操作
lock = threading.Lock()
def Producer(name):
"""
生产者在0-3秒内动态生产饺子
"""
count = 1
global lock
while True:
time.sleep(random.randrange(3))
#生产者线程进入临界区
#修改缓冲区前加锁
lock.acquire()
#缓冲区满,生产者线程阻塞,虽然此处的缓冲区(队列)没有设置maxsize
q.put(count, block=True)
print('Producer %s produced 1 jiaozi, has produced %s jiaozi...%i jiaozi left' %(name, count, q.qsize()))
count +=1
lock.release()
#生产者线程退出临界区
def Consumer(name):
"""
消费者在0-4秒内动态消费饺子
"""
count = 1
global lock
while True:
time.sleep(random.randrange(4))
#消费者线程进入临界区
lock.acquire()
if not q.empty():
#缓冲区为空,消费者线程阻塞,虽然此处的缓冲区(队列)没有设置maxsize
q.get(block=True)
print('\033[32;1mConsumer %s took 1 jiaozi, has taken %s jiaozi...%i jiaozi left\033[0m' %(name, count, q.qsize()))
count += 1
lock.release()
#消费者线程退出临界区
if __name__ == '__main__':
p1 = threading.Thread(target=Producer, args=('p1',))
p2 = threading.Thread(target=Producer, args=('p2',))
c1 = threading.Thread(target=Consumer, args=('c1',))
c2 = threading.Thread(target=Consumer, args=('c2',))
p1.start()
p2.start()
c1.start()
c2.start()
操作系统OS,Python - 生产者消费者模型的更多相关文章
- python生产者消费者模型
业界用的比较广泛,多线程之间进行同步数据的方法,解决线程之间堵塞,互相不影响. server --> 生产者 client --> 消费者 在一个程序中实现又有生产者又有消费者 ,生产者不 ...
- python生产者消费者模型优点
生产者消费者模型:解耦,通过队列降低耦合,支持并发,生产者和消费者是两个独立的并发体,他们之间使用缓存区作为桥梁连接,生产者指望里丢数据,就可以生产下一个数据了,消费者从中拿数据,这样就不会阻塞,影响 ...
- python 生产者消费者模型
import time def consumer(name): print("%s开始吃包子了"%name) while True: ret = yield time.sleep( ...
- python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))
昨日内容回顾 python中启动子进程并发编程并发 :多段程序看起来是同时运行的ftp 网盘不支持并发socketserver 多进程 并发异步 两个进程 分别做不同的事情 创建新进程join :阻塞 ...
- python网络编程--进程(方法和通信),锁, 队列,生产者消费者模型
1.进程 正在进行的一个过程或者说一个任务.负责执行任务的是cpu 进程(Process: 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在 ...
- 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼
1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...
- python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型
一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...
- Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型
一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...
- python 进程锁 生产者消费者模型 队列 (进程其他方法,守护进程,数据共享,进程隔离验证)
#######################总结######### 主要理解 锁 生产者消费者模型 解耦用的 队列 共享资源的时候 是不安全的 所以用到后面的锁 守护进程:p.daem ...
随机推荐
- 二次封装 Reponse,视图家族
复习 """ 1.整体修改与局部修改 # 序列化 ser_obj = ModelSerializer(model_obj) # 反序列化,save() => cre ...
- 【原】linux增加开机自启动脚本
在rc.local脚本中添加开机自启动程序
- Pascal 错误代码及含义
DOS 错误代码:1无效DoS功能号 2文件末找到 3路径未找到 4打开文件过多 5禁止文件存取 6无效文件句柄 12无效文件存取代码 15无效驱动器号 16不能删除当前日录 17不能跨驱动器改文件名 ...
- 「JSOI2015」染色问题
「JSOI2015」染色问题 传送门 虽然不是第一反应,不过还是想到了要容斥. 题意转化:需要求满足 \(N + M + C\) 个条件的方案数. 然后我们就枚举三个数 \(i, j, k\) ,表示 ...
- (办公)记事本_linux网络命令
参考谷粒学院的linux视频教程:http://www.gulixueyuan.com/course/300/task/7091/show 阿里云ECS云服务器更换公网IP的方法:https://yq ...
- 2019年小结&2020年展望
每篇一句 If you want love, then this is it. This is real life. It's not perfect but it's real. --Before ...
- Kettle — 使用手册
https://blog.csdn.net/u013468915/article/details/82629260 kettle 教程(一):简介及入门 https://blog.csdn.net/q ...
- slot插槽
具名插槽只能是template模板标签 插槽组件 <section class="hello"> <slot>Welcome</slot> &l ...
- 消息队列(四)--- RocketMQ-消息发送2
概述 接着我们上一篇继续分析消息发送,上节讲到消息发送前有可能遇到 broker 失效的情况,RocketMQ 主要是采用两种策略 : 重试发送 broker 故障延迟机制 后者指的是当发送给 ...
- dom4j+反射实现bean与xml的相互转换
由于目前在工作中一直用的dom4j+反射实现bean与xml的相互转换,记录一下,如果有不正确的地方欢迎大家指正~~~ 一.反射机制 在此工具类中使用到了反射技术,所以提前也看了一些知识点,例如:ht ...