几日所学内容:
一、多进程:
二、阻塞 非阻塞 并行 并发
三、三种状态的切换
四、进程的两种使用方式
五、join 函数 (重点)
六、孤儿进程与僵尸进程
七、常用属性
一、多进程:
进程:一个正在被运行的程序就称之为进程,是程序具体执行过程,一种抽象概念,进程来自于操作系统
创建新的进程方式:
1、系统初始化
2、一个进程在运行过程中开启了子进程
3、用户的交互式请求,而创建一个新程序
4、一个批处理作业的初始化(只在大型机的批处理系统中应用)
进程与程序的区别:
程序就是一堆计算机可以识别文件,程序在没有被运行时就是存在硬盘上的一堆二进制
运行程序时,要从硬盘读取数据到内存中,CPU从内存读取指令并执行
程序一旦运行就产生了进程
一个程序可以多次执行 产生多个进程,但是进程之间相互独立
二、阻塞 非阻塞 并行 并发 (重点)
阻塞 : 程序遇到io操作是就进入了阻塞状态
本地IO:input print sleep read write
非阻塞: 程序正常运行中 没有任何IO操作 就处于非阻塞状态
阻塞 非阻塞 说的是 程序的运行状态
并发: 多个任务看起来是在同时处理,本质上是切换执行,只不过是切换速度非常快
并行: 多个任务真正的同时执行,必须具备多核CPU,才可能并行
并发 并行 说的是 任务的处理方式
三、三种状态的切换
就绪态,运行态,阻塞态
多道技术会在进程执行时间过长或遇到IO时自动切换其他进程,意味着IO操作与进程被剥夺CPU执行权都会造成进程无法继续执行
程序员永恒的话题:提高效率
根本方法就是让程序尽可能处于运行状态;减少IO 尽可能的多占用CPU时间;缓冲区就是用于减少IO操作的
四、进程的两种使用方式: (重点)
2、继承Process类 ,覆盖run方法 将任务放入run方法中
3、在windows下,开启子进程必须放在 if __name__ == '__main__' 下运行,因为windows在开启子进程时会重新加载所有的代码造成递归创建进程
五、join 函数 (重点)
Process的对象具备一个join函数
用于提高子进程优先级 ,使得父进程等待子进程结束
六、孤儿进程与僵尸进程
孤儿进程:
指的是,父进程先结束 ,而子进程还在运行着,孤儿进程无害,有其存在的必要性
例如:qq开启了浏览器,qq先退出了 浏览器应该继续运行,孤儿进程会被操作系统接管
僵尸进程:
指的是:子进程已经结束了,但是操作系统会保存一些进程信息,如PID,运行时间等,此时这个进程就称之为僵尸进程
僵尸进程有害,僵尸进程如果太多将会占用大量的资源,造成系统无法开启新新进程
linux 中有一个wait/waitpid 用于父进程回收子进程资源
pythony 已经封装好,会自动回收僵尸进程
清除僵尸进程的方法:杀死父进程,让它变成父进程。
七、常用属性:
p.join() # 等待子进程结束,实质是提高子进程的优先级
p.star # 开始进程
p.terminate() # 终止进程 与start一样 都是给操作系统发送指令 所以会有延迟
daemon # 守护进程
print(p.name) # 进程的名称
print(p.is_alive()) # 是否存活
print(p.is_alive()) # 这个进程是否还存活
print(p.pid) # 得到子进程的 ip
print(p.exitcode) # 获取退出码