并发编程2
守护进程
守护进程也是一个进程,可以守护着另一个进程
一个进程a设置为b的守护进程,当b结束时a会立刻结束自己不管任务是否执行完毕
将进程的daemon属性设置为True时这个进程变成了守护进程,设置daemon属性时必须在开始进程之前
进程安全
使用Lock来实例化产生一把锁,但是要保证每一个进程访问的都是同一把锁
在访问共享资源前加锁(acquire),访问完毕后要解锁(release)
注意:不能多次加锁必须在解锁后才能再次加锁
加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行修改,牺牲了速度保证了数据安全
在使用锁的时候,无可避免的会降低效率需要找到一个最合适的地方加上锁,锁住的代码越少效率越高
join 和 锁
join是让整个进程中的代码全部串行,而锁仅仅是让部分代码串行
粒度(被锁住的代码)越少效率越高
互斥锁
相互排斥对方的锁
一个进程在执行时另一个进程会等待
IPC 进程间通讯
进程与进程之间内存是物理隔离的无法直接通讯
四种通讯方式:
1 使用一个共享文件,在硬盘创建一个文件,不同进程之间共享这个文件
优点:交换数据量几乎没有限制
缺点:速度慢
2 系统开辟一块共享内存,以供进程间交换数据
通过Manager来开辟
优点:速度快
缺点:数据量不能太大
3 管道
优点:封装了文件的打开,关闭等操作
缺点:速度慢并且是单向的,编程复杂度较高
4 socket
不仅可以用于远程计算机中的进程通讯,还可以用于本地进程通讯基于内存,速度快
Queue
队列是一个容器
特点:先进先出,支持进程间数据共享,自动处理了进程安全问题(加锁)
通过put来加数据,通过get获取数据
生产者消费者模型
将原本由一个进程完成的事拆分为两个,交给两个不同的进程(生产者,消费者)来完成
由于进程间内存相互隔离,所以需要为两个角色之间提高一个共享数据的容器
生产者将生产完成的数据放入容器
消费者从容器中取出数据来处理
生产者消费者模型的优点:
1 平衡了生产者和消费者之间的能力差异,提高处理效率
2 降低双方的耦合度
学习并发的两个核心问题是安全性和效率