守护进程,互斥锁, IPC ,Queue队列,生产消费着模型
1.守护进程
什么是守护进程?
进程是一个正在运行的程序
守护进程也是一个普通进程,意思是一个进程可以守护另一个进程,比如如果b是a的守护进程,a是被守护的进程,如果a进程结束,b进程也会随之结束。
使用场景:
父进程交给了子进程一个任务,子进程在执行过程中并没有执行完毕,但是父进程结束了,那么子进程就没又继续执行的意义了
使用方法:在start 前面加 deamon = Ture
案例:
from multiprocessing import Process
import time
def task():
print('子进程开启了')
time.sleep(5)
print('你跟着去吧') if __name__ == '__main__':
print('父进程开始了')
p = Process(target=task) # 使用daemon方法来守护父进程,如果父进程提前结束了
# 那么子进程也会一起结束
p.daemon = True
p.start()
time.sleep(2)
print('父进程结束了')
2.互斥锁
什么是互斥锁?
互斥锁,意思是互相排斥的锁,在程序中的意思是。如果这个资源已经被锁定了,那么其他的进程则无法使用该资源
PS: 锁,并不是真的把资源锁起来了,只是在代码层面限制你的代码不能执行
为什么需要互斥锁?
并发带来资源的竞争问题:
当多个进程同时要操作同一个资源时,将会导致数据错乱的问题,那么解决这样问题的方案有两种
1. 是用 join ,等子进程结束后再执行其他进程,这样做的效果确实能实现资源竞争的问题,但是却降低了效率,如果这样操作就没有必要开启子进程了,而且本来多个进程之间是公平竞争的,而join方法,就必须按照join的执行顺序来进行,所以这是不合理的
2. 给公共资源加锁
每个进程间是公平的,都是同时竞争,但是如果有一个进程抢到了资源,就会把资源锁住,那么其他的程序就只能等哪个进程释放锁之后才能使用。
锁与join的区别
1. join是固定了执行顺序,不仅会造成父进程等待子进程结束后才能继续执行,而且浪费资源
而锁是公平竞争,谁先抢到谁先执行,父进程依然可以继续执行,不受干扰
2.最主要i的区别
join是把进程的任务全部串行
锁可以锁任意代码,可以自主的调整锁定的粒度
使用方法:
在你需要执行的代码前加 acpuire 方法,代码的后面加 release
案例:
'''
并发将带来资源的竞争问题
当多个进程同时要操作同一个资源时,将会导致数据错乱的问题 ''' def task1(lock):
# acquire 将进程上锁(并不是上锁),是让其他进程必须等抢到系统资源
# 的进程执行完毕后才能执行
lock.acquire()
print('哒哒哒哒哒哒冒蓝光的加特林')
print('biubiubiubiu冒红光的M416')
print('砰砰砰砰砰砰冒黄光的手榴弹')
# 当进程执行完后要释放锁,让其他进程使用
lock.release() def task2(lock):
lock.acquire()
print('冒蓝光的加特林')
print('冒红光的M416')
print('黄光的手榴弹')
lock.release() def task3(lock):
lock.acquire()
print('加特林')
print('M416')
print('手榴弹')
lock.release() if __name__ == '__main__':
# 需要先实例化得到一把锁
# 需要注意的是,不要对同一把执行两次acquire,会锁死
# 导致程序无法运行,一此acquire必须对应一次release
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()
3.IPC
IPC = 进程间通讯 (通讯指的是互相交换数据)
进程之间内存是相互隔离的,当一个进程想要把数据给另外一个进程的时候,就需要考虑IPC
进程之间传输数据的方式:
1.管道:只能单向通讯,数据都是二进制(subprocess)
2.文件:在银盘上创建共享文件
缺点: 速度慢
优点: 数据量没有限制
3.socket
编程难度复杂
4. 共享内存
优点: 速度块
缺点: 数据量不能太大
共享内存的方式
Manager类
Manager提供很多数据结构 list dict 等等
Manager所创建出来的数据结构,具备进程间共享的特点
案例:
from multiprocessing import Process,Manager,Lock
def task(data, lock):
lock.acquire()
num = data['num'] data['num'] = num - 1
lock.release() if __name__ == '__main__':
# Manager 开启一个共享字典,这个字典子进程与父进程公同拥有
m = Manager()
data = m.dict({'num': 10})
lock = Lock() for i in range(10):
p = Process(target=task, args=(data, lock))
p.start()
p.join()
print(data)
PS: 需要强调的是Manager创建的一些数据结构是不带锁的,可能会出现问题
4.Queue队列 *****(重点)
Queue队列帮我们处理了锁的问题,重点
队列是一种特殊的数据结构,先存储的先取出,先进先出
相反的是堆区,先存储的后取出,先进后出
PS:函数嵌套调用时,执行顺序是先进后出的,所以也称之为函数栈
调用函数时,函数入栈,函数结束就出栈
案例:
from multiprocessing import Queue # 创建队列,不指定maxsize 则没有数量限制
q = Queue(3) # 存储元素
q.put('abc')
q.put('')
q.put('哈哈哈') print(q.get())
print(q.get())
print(q.get()) # 如果容量已经满了,在调用put时将会进入阻塞状态
# 直到有人从队列中拿走数据有空位置才会继续执行 # 如果队列已经空了,在调用get时将进入阻塞状态,
# 直到有人存储了新的数据到队列中,才会继续 # block 表示是否需要进行阻塞,默认是阻塞的,当设置为False,并且队列为空时,则抛出异常
# timeout 表示阻塞的超时时间,超过时间还是没有值或还是没位置则抛出异常,仅在block为True有效 # 此处如果没有值,则会阻塞两秒,如果还没有值,则报异常
# q.get(block=True,timeout=2) # 此处存值时,如果容器满了,则不会阻塞,直接报异常
# q.put('123', block=False)
5.生产消费着模型
生产者:产生数据的一方
消费者:处理数据的一方
生产者与消费者中存在的问题:
生产者和消费者处理速度不平衡,一方快一方慢,导致一方需要等待另一方
双方是耦合在一起的,消费者必须等待生产者生成完毕后才能开始处理,
但是如果消费者消费速度太慢,生产者必须等待其处理完毕才能开始生成下一个数据
解决途径:
将双方分开,生产者专门生产,消费者专门消费,两者不需要等待某一方结束后才能执行
但是这样一来就需要一个共同的容器,生产者完成后放入容器,消费者从容器中取出数据,这样就解决了双方能力不平衡的问题,完成时间快的一方继续完成,无需等待另一方
案例:
from multiprocessing import Process, Queue, Lock
import time, random, os # 消费者
def consumer(q):
# 假如消费者点了10盘菜
for i in range(10):
# 因为吃饭需要时间,所以使用tiem模拟了时间
time.sleep(random.randint(0, 2))
# 通过从Queue容器获取生产者的数据
rose = q.get()
print('%s已经吃完了%s' % (os.getpid(), rose)) # 生产者
def producer(q):
# 生产者需要烧制10盘菜
for i in range(10):
# 因为制作菜需要时间,所以也使用了tiem 模拟了时间
time.sleep(random.randint(0, 2))
print('第%s盘菜烧好了' % i)
rose = ('第%s盘菜' % i)
# 使用put方法往Queue中添加数据
q.put(rose) if __name__ == '__main__':
# 创造一个Queue来存储数据
q = Queue()
c = Process(target=consumer,args=(q,))
p = Process(target=producer,args=(q,))
c.start()
p.start()
守护进程,互斥锁, IPC ,Queue队列,生产消费着模型的更多相关文章
- 进程(守护进程--互斥锁--IPC机制--生产者模型--僵尸进程与孤儿进程--模拟抢票--消息队列)
目录 一:进程理论知识 1.理论知识 二:什么是进程? 三:僵尸进程与孤儿进程 1.僵尸进程 四:守护进程 1.什么是守护进程? 2.主进程创建守护进程 3.守护进程 五:互斥锁(模拟多人抢票) 1. ...
- 守护进程,互斥锁,IPC,队列,生产者与消费者模型
小知识点:在子进程中不能使用input输入! 一.守护进程 守护进程表示一个进程b 守护另一个进程a 当被守护的进程结束后,那么守护进程b也跟着结束了 应用场景:之所以开子进程,是为了帮助主进程完成某 ...
- 守护模式,互斥锁,IPC通讯,生产者消费者模型
'''1,什么是生产者消费者模型 生产者:比喻的是程序中负责产生数据的任务 消费者:比喻的是程序中负责处理数据的任务 生产者->共享的介质(队列)<-消费者 2,为何用 实现了生产者与消费 ...
- 4-[多进程]-互斥锁、Queue队列、生产者消费者
1.互斥锁 (1)为什么需要互斥锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如下 #并发运行,效率 ...
- 进击的Python【第九章】:paramiko模块、线程与进程、各种线程锁、queue队列、生产者消费者模型
一.paramiko模块 他是什么东西? paramiko模块是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 先来个实例: import param ...
- 4 并发编程-(进程)-守护进程&互斥锁
一.守护进程 主进程创建子进程,然后将该进程设置成守护自己的进程,守护进程就好比崇祯皇帝身边的老太监,崇祯皇帝已死老太监就跟着殉葬了. 关于守护进程需要强调两点: 其一:守护进程会在主进程代码执行结束 ...
- 8.9 day30 并发编程 进程理论 进程方法 守护进程 互斥锁
多道技术 1.空间上的复用 多个程序共用一套计算机硬件 多道技术原理 2.时间上的复用 切换+保存状态 1.当一个程序遇到IO操作 操作系统会剥夺该程序的CPU执行权限( 提高了CPU的利用率 ...
- python并发编程-进程理论-进程方法-守护进程-互斥锁-01
操作系统发展史(主要的几个阶段) 初始系统 1946年第一台计算机诞生,采用手工操作的方式(用穿孔卡片操作) 同一个房间同一时刻只能运行一个程序,效率极低(操作一两个小时,CPU一两秒可能就运算完了) ...
- 4、网络并发编程--僵尸进程、孤儿进程、守护进程、互斥锁、消息队列、IPC机制、生产者消费者模型、线程理论与实操
昨日内容回顾 操作系统发展史 1.穿孔卡片 CPU利用率极低 2.联机批处理系统 CPU效率有所提升 3.脱机批处理系统 CPU效率极大提升(现代计算机雏形) 多道技术(单核CPU) 串行:多个任务依 ...
随机推荐
- luogu3720 [AHOI2017初中组]guide[最短路]
初中组..唉 题意有点误解,当前在x点走一步,gps产生代价条件是沿非x到n的最短路走. 直接倒着跑两遍$i\sim n$的两种最短路,然后枚举每条边走的时候是否可以在两种最短路上,不是就产生1个代价 ...
- Kettle 事务、转换内顺序、excel模版、使用踩坑
kettle中转换和作业的执行顺序: 1.一个作业内的转换,是顺序执行的. 2.一个转换内的步骤是并行执行的. 3.作业内不支持事务,转换内支持事务. 根据业务需要,通常需要在 ...
- Java-收邮件
import java.util.Properties; import javax.mail.Folder; import javax.mail.Message; import javax.mail. ...
- vue项目中,点击按钮复制其内容
<el-table-column label="推广链接" align="center"> <template slot-scope=&quo ...
- java上传大文件解决方案
需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在10G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以10G来进行限制. 第一步: 前端修改 由于项目使用的是BJ ...
- 使用kombu的producer pool 向rabbitmq瞬间发送大量消息
kombu比pika感觉考虑得全面多了,不知道为什么用的人好像少? 生产端是 python-socket.io 的client 接受socketio 消息后, 发到rabbitmq 按时序进行处理 ...
- MessagePack Java 0.6.X 动态类型
我们知道 Java 是一个静态类型的语言.通过输入 Value MessagePack能够实现动态的特性. Value 有方法来检查自己的类型(isIntegerType(), isArrayType ...
- Uva 10129 Play on Words(欧拉路)
一些秘密的门包含一个非常有趣的单词拼图.考古学家们必须解决的问题 它打开那门.因为没有其他的方式来打开大门,这个谜是非常重要的 我们. 每扇门上都有大量的磁性板.每一个盘子上都有一个字 它.板块必须以 ...
- Zabbix 4.0.2试用(七):在Linux主机中安装zabbix agent并添加该主机(yum源安装)
Zabbix 4.0.2试用(七):在Linux主机中安装zabbix agent并添加主机(yum源安装) 2018年12月20日, 上午6:42 之前介绍的是下载源安装包,编译安装的方式来安装ag ...
- HDU 5810 Balls and Boxes ——(数学,概率,方差)
官方题解看不太懂,参考了一些人的博客以后自己证明如下: 其中D(X)和E(X)的公式如下(参考自百度百科): 其中 p = 1 / m .(这是每一个单独事件发生的概率期望,在这里单独事件指的是一个球 ...