守护进程,进程安全,IPC进程间通讯,生产者消费者模型
1.守护进程(了解)
2.进程安全(*****)
互斥锁
抢票案例
3.IPC进程间通讯
manager
queue(*****)
4.生产者消费者模型 守护进程
指的也是一个进程,可以守护着另一个进程
一个进程a 设置为b的守护进程 当b结束时 a会立马结束自己 不管任务是否执行完毕
使用场景: 例如qq进程 有一个下载任务 交给了一个子进程 但是过程中 qq退出了 下载进程也可以随之关闭了 *** p.daemon=True 将p子进程设置为主进程的守护进程 必须放在开启进程之前设置*** 进程安全问题
当多个进程要同时操作同一个资源时,就可能出现问题
例如:
只有一台答应机大那会很多打印任务 如果不加以控制 可能造成打印结果错乱
解决方案1:加 join 把原本并发的任务变成串行执行
但是如此一来 进程与顺序就不再平等 顺序已经固定死
最终的解决方案就是加锁
使用Lock来实例化产生一把锁
但是要保证每个进程访问的都是同一把锁
在访问共享资源前 加锁
访问完毕后一定要解锁
不能多次执行acquire 一次acquire对应一次release
acquire 是一个阻塞函数 会一直等到锁被释放(release调用)才会继续执行 lock=Lock()
lock.acquire() 锁定
lock.release() 解锁
# from multiprocessing import Process,Lock
# import time,random
#
# def task1(lock):
# lock.acquire()
# print('惺惺相惜想')
# time.sleep(random.randint(1,2))
# lock.release()
#
#
# def task2(lock):
# lock.acquire()
# print('xxx')
# time.sleep(random.randint(1, 2))
# lock.release()
#
# def task3(lock):
# lock.acquire()
# print('1234')
# time.sleep(random.randint(1, 2))
# lock.release()
#
#
# if __name__ == '__main__':
# lock=Lock()
# p1=Process(target=task1,args=(lock,))
# p2 = Process(target=task2, args=(lock,))
# p3 = Process(target=task3, args=(lock,))
#
# p1.start()
# p2.start()
# p3.start()
加锁
加锁之后 并发又变成了串行了 不过与join不同的是 没有规定顺序 谁先抢到谁先执行 问题:一旦加锁 效率降低 不加锁数据要错乱 在使用锁的时候 无可避免的会降低效率
需要找到一个最合适的地方加上锁
你锁住的代码越少效率越高 join是让整个进程中的代码全部串行 而锁可以部分代码串行
粒度(被锁住的代码量)越小 效率越高 互斥锁:互相排斥其他进程 IPC 进程间通讯
进程与进程之间 内存是物理隔离的 无法直接通讯 1.使用一个交换文件 在硬盘上创建一个文件 不同进程之间共享这个文件
优点:交换的数据量几乎没有限制
缺点:速度慢
2.系统开辟一块共享内存 来供进程间交换数据
优点:速度快
缺点:交换的数据量不能太大
3.管道
优点:封装了文件的打开 关闭等操作
缺点:速度慢 单向传输 编程的复杂度较高
4.socket
不仅可用于与远程计算机中的进程通讯 还可以用于与本地进程通讯
基于内存的速度快
# from multiprocessing import Process,Manager,Lock
#
# import time
#
#
#
# def task(dic,lock):
# lock.acquire()
# i = dic["num"] # 3 3 3
# time.sleep(0.3) #2 2 2
# dic["num"] = i - 1
# lock.release()
#
# if __name__ == '__main__':
# # 共享内存管理器
# m = Manager()
# # 在共享内存区域 创建了一个字典
# dic = m.dict({"num":3})
#
# lock = Lock()
# # 将处于共享内存区域的字典传给子进程
# p =Process(target=task,args=(dic,lock))
# p1 = Process(target=task, args=(dic,lock))
# p2 = Process(target=task, args=(dic,lock))
#
#
# p.start()
# p1.start()
# p2.start()
#
# p.join()
# p1.join()
# p2.join()
#
#
#
# print(dic["num"])
IPC
Manager 共享内存管理器
开启一个共享的内存区域 可以是列表 字典 array数组
没有处理进程安全问题 需要自己加锁
queue 队列也是一个容器
特点:先进先出
支持进程间共享
自动出来了进程安全问题(加锁)
例如:迅雷下载 先添加的任务一定先开始执行 堆栈:
特点:先进后出
例如:函数的执行 吃薯片 最上面的最先吃 put()会阻塞,直到队列里面有位置为止
get()也会阻塞,直到队里里面有数据为止
put(obj,block=True,timeout),block为阻塞的意思,默认为阻塞状态,
timeout等待超时,只有在block为True时有效
# from multiprocessing import Process,Manager,Queue
#
# import time
#
#
#
# def task(q):
# num = q.get() # 3
# time.sleep(0.5)
# q.put(num-1)
#
#
# if __name__ == '__main__':
#
# q = Queue()
# q.put(3)
# # 将处于共享内存区域的字典传给子进程
# p =Process(target=task,args=(q,))
# p1 = Process(target=task, args=(q,))
# p2 = Process(target=task, args=(q,))
#
#
# p.start()
# p1.start()
# p2.start()
#
# p.join()
# p1.join()
# p2.join()
#
#
#
# print(q.get())
QUE队列
生产者消费者模型
模型即解决某个问题的套路
问题:
生产者负责产生数据
消费者处理数据
当消费者与生产者的能力不匹配时,必须一放要等待另一方 这样效率就变低了 1.将原本由同一个进程完成的 两个(生产和消费) 拆分为两个不交给两个不同的角色(进程)来完成
2.由于进程间内存相互隔离 所以需要为两个角色之间提供一个共享的数据容器
3.生产 将生产完成的数据 放入容器中
4.消费者从 容器中取出数据来处理 生产者消费者模型的优点:
1.平衡了生产者和消费者之间的能力差异 提高处理效率
2.降低了双方耦合度 学习并发 的两个核心问题 安全性 和 效率
from multiprocessing import Process,Queue
import time,random # 生产者
def xiaomi_factory(name,q):
for i in range(1,6):
time.sleep(random.randint(1,3))
phone = "这是%s生产的 小米9_%s" % (name,i)
print("生产者 生产了%s" % phone)
# 方到柜台 即 存储到队列中
q.put(phone) # 消费者
def buy_mi9(q):
for i in range(10):
# 从队列中取出需要被处理的数据(phone)
time.sleep(random.randint(1, 2))
phone = q.get()
print("消费者 消费了%s" % phone) if __name__ == '__main__':
# 共享数据的队列
q = Queue() # 生产者
p1 = Process(target=xiaomi_factory,args=("北京公司",q))
p2 = Process(target=xiaomi_factory,args=("上海公司",q))
p1.start()
p2.start() # 消费者
c1 = Process(target=buy_mi9,args=(q,))
c1.start()
生产者消费者模型
守护进程,进程安全,IPC进程间通讯,生产者消费者模型的更多相关文章
- [并发编程 - socketserver模块实现并发、[进程查看父子进程pid、僵尸进程、孤儿进程、守护进程、互斥锁、队列、生产者消费者模型]
[并发编程 - socketserver模块实现并发.[进程查看父子进程pid.僵尸进程.孤儿进程.守护进程.互斥锁.队列.生产者消费者模型] socketserver模块实现并发 基于tcp的套接字 ...
- Python 35 进程间的通信(IPC机制)、生产者消费者模型
一:进程间的通信(IPC):先进先出 管道:队列=管道+锁 from multiprocessing import Queue q=Queue(4) q.put(['first',],block=T ...
- 守护模式,互斥锁,IPC通讯,生产者消费者模型
'''1,什么是生产者消费者模型 生产者:比喻的是程序中负责产生数据的任务 消费者:比喻的是程序中负责处理数据的任务 生产者->共享的介质(队列)<-消费者 2,为何用 实现了生产者与消费 ...
- python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))
昨日内容回顾 python中启动子进程并发编程并发 :多段程序看起来是同时运行的ftp 网盘不支持并发socketserver 多进程 并发异步 两个进程 分别做不同的事情 创建新进程join :阻塞 ...
- java多线程:线程间通信——生产者消费者模型
一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是,多个线程之间如何协作呢? 我们看一个仓库 ...
- Python之网路编程之-互斥锁与进程间的通信(IPC)及生产者消费者模型
一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...
- 4、网络并发编程--僵尸进程、孤儿进程、守护进程、互斥锁、消息队列、IPC机制、生产者消费者模型、线程理论与实操
昨日内容回顾 操作系统发展史 1.穿孔卡片 CPU利用率极低 2.联机批处理系统 CPU效率有所提升 3.脱机批处理系统 CPU效率极大提升(现代计算机雏形) 多道技术(单核CPU) 串行:多个任务依 ...
- (并发编程)进程IPC,生产者消费者模型,守护进程补充
一.IPC(进程间通信)机制进程之间通信必须找到一种介质,该介质必须满足1.是所有进程共享的2.必须是内存空间附加:帮我们自动处理好锁的问题 a.from multiprocessing import ...
- 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)
参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...
随机推荐
- 设计模式之装饰器模式io的小入门(十一)
装饰器模式详解地址 原文总结 定义: 在不必改变原类文件和使用继承的情况下, 动态的扩展一个对象的功能. 通过创建一个包装对象, 也就是装饰来包裹真实的对象 部分详解提示 看了一些文档, 装饰器模式非 ...
- ORACLE:毫秒与日期的相互转换,获取某天的信息
毫秒转换为日期 SELECT TO_CHAR(1406538765000 / (1000 * 60 * 60 * 24) + TO_DATE('1970-01-01 08:00:00', 'YYYY- ...
- Cookie存储大小、个数限制
一.浏览器允许每个域名所包含的cookie数: Microsoft指出InternetExplorer8增加cookie限制为每个域名50个,但IE7似乎也允许每个域名50个cookie. Firef ...
- (一)Hybrid app混合开发模式
hybrid app是什么? 这里我们先看一下词条上的定义 Hybrid App:Hybrid App is a mobile application that is coded in both br ...
- Windows到Ubuntu免密登陆
Windows到Ubuntu免密登陆 首先检查C盘用户文件夹下是否有.ssh文件夹,同时检查该文件夹中是否有至少两个文件,一个是xxx_rsa和xxx_rsa.pub,一个是私钥文件一个是公钥文件. ...
- 关于基于Linphone的视频通话Android端开发过程中遇到的问题
关于基于Linphone的视频通话Android端开发过程中遇到的问题 运用开源项目Linphone的SDK进行开发,由于是小组进行开发,我主要负责的是界面部分. 由于当时是初学Android开发,对 ...
- 【起航计划 030】2015 起航计划 Android APIDemo的魔鬼步伐 29 App->Preferences->Preferences from code
这里我们使用类比的方法,将 PreferenceActivity 与一般的Activity 作个类比,可以更好的理解Android.Preference中的各个类. PreferenceActivit ...
- PAT1137
题意 一个学生的成绩由上机,期中,期末共3部分构成,现要求找出有资格获得证书的同学们. 证书获得者要求:上机分至少200,最终成绩及格. 最终成绩的生成规则:若期中分>期末分,则f = 期中 * ...
- 两台windows内网之间快速复制大量(上百万个)小文件(可用于两台服务器之间)
用各种FTP工具(各种主动被动)都不好使.经测试,用以下的(协议.工具等),在双千兆网卡下,传输大量1M的文件可以达到每秒60多M: windows文件共享(SMB协议)(若是08 r2 数据中心版, ...
- ARM实验4—按键轮询实验
key_poll按键轮询实验 实验内容: 通过FS_4412开发板上的按键控制LED灯并打印信息. 实验目的: 熟悉开发环境的使用. 掌握猎户座4412处理器的GPIO接口, 实验平台: FS4412 ...