守护进程-互斥锁-IPC
守护进程?
就是指用一个进程去守护另一个进程. 守护进程的代码非常简单: p.daemon = True
注意:必须在启动进程之前执行
什么时候需要使用守护进程?
例如: qq中有个下载视频 应该用子进程去做 但是 下载的过程中 qq退出 那么下载也没必要继续了
互斥锁
什么时候用锁?
当多个进程 同时读写同一份数据 数据很可能就被搞坏了
第一个进程写了一个中文字符的一个字节 cpu被切到另一个进程
另一个进程也写了一个中文字符的一个字节
最后文件解码失败
问题之所以出现 是因为并发 无法控住顺序
目前可以使用join来将所有进程并发改为串行
与join的区别?
多个进程并发的访问了同一个资源 将导致资源竞争(同时读取不会产生问题 同时修改才会出问题)
第一个方案 加上join 但是这样就导致了 不公平 相当于 上厕所得按照颜值来
第二个方案 加锁 谁先抢到资源谁先处理[
相同点: 都变成了串行
不同点:
1.join顺序固定 锁顺序不固定!
2.join使整个进程的任务全部串行 而锁可以指定哪些代码要串行
锁使是什么?
锁本质上就是一个bool类型的标识符 大家(多个进程) 在执行任务之前先判断标识符
互斥锁 两个进程相互排斥
注意 要想锁住资源必须保证 大家拿到锁是同一把
怎么使用?
在需要加锁的地方 lock.acquire() 表示锁定
在代码执行完后 一定要lock.release() 表示释放锁
lock.acquire()
放需要竞争资源的代码 (同时写入数据)
lock.release()
进程间的通讯
IPC 指的是进程间通讯
之所以开启子进程 肯定需要它帮我们完成任务 很多情况下 需要将数据返回给父进程
然而 进程内存是物理隔离的
解决方案:
1.将共享数据放到文件中 这样有点慢
2.管道 subprocess中的那个 管道只能单向通讯 必须存在父子关系
3.共享一块内存区域 得操作系统帮你分配 速度较快
进程间通讯的另一种方式 使用queue
queue 队列
队列的特点:
先进的先出
后进后出
get 和 put的使用