进程,线程
进程,线程
单核cpu一次只能执行一个任务,
电脑运行速度
cpu程序运行:时间片轮训,调度算法
优先级调度算法
视觉散流:1/24秒
并发和并行:
并行:真正的同时执行多个任务
并发:操作系统就是并发的,看起来是同时执行的
操作系统实现多任务的原理是::
通过调度算法调度任务执行实现多任务
进程的创建---fork() 叉
fork:叉,餐叉,靶,叉起,分叉,分歧
进程:代码,cpu,内存,磁盘,网络资源
代码是程序:运行的程序时进程。
进程是分配资源的最小单位
pid是进程号,pid子进程= 0 父进程返回子进程pid大于0的
方便管理进程
创建完fork()之后,各自执行各自的
对于子进程pid = =0
孤儿进程:父进程先死,子进程再死
僵尸进程:子进程先死,父进程再死
僵尸进程:弊端:僵尸仍然占用资源,么有释放。
解决僵尸进程:我们的子进程回收,通过父进程进程回收
os.wait 资源回收,
多进程开发:需要回收子进程资源
获取pid :getpid():获取当前进程的pid,getppid():获取父类pid
fork完成以后资源进行了拷贝,不共享全局变量
fork完成之后,系统调度进行导致,执行流程操作系统说了算,根据现状,有可能让子进程先执行也有可能让父进程先执行
执行无序性:
Process(group【】)
target= 指定继承要执行的任务
agrs,参数:任务参数
args,是一个
kwargs:调用对象的关键字参数字典
name。为当前进程实例的别名
group:大多数情况下用不到,进程分组
Process类常用属性:
name;
pid:
is_alive:进程死活
join:回收进程资源,默认阻塞 join 必须在terminate之后
terminate:进程终止,不回收资源
总结:
多任务的概念:
多任务的实现原理:通过调度算法实现1,时间轮流,2 ,优先级
并行并发:
并行:一起执行的
并发:看起来是一起执行的,对人来说的,
计算机是怎么调度任务的:跟换进程任务,通过中断,来实现
qq,通过中断,qq中的所有资源,快照,保存状态,
挂起:执行挂起的,会保存当前的状态,
fork():创建新的进程:给我们返回两个值
通过pid返回值来判断实现多任务的
fork主进程和子进程有设么关系
fork后的子进程会把主进程的所有资源拷贝(代码执行状态)
僵尸进程的危害:僵尸进程会占用系统资源
通过wait回收进程资源,
僵尸进程:子进程死了,主进程没死,子程序还占有资源
孤儿进程:会丢到1号进程
多进程修改全局变量:多进程资源不共享
多次for问题:依赖fork创建过程
为了便于回收资源,解决方案:只有一个主进程:让主进程生成
子进程,
multiProcessing
通过process类,
1.导入
2.定义子进程执行方法
3.初始化process对象(args元组最后要加一个,)
4.start启动我们进程
5.join回收资源(多个子进程回收)
5.join阻塞回收
阻塞超时,如果子进程没有执行完,就走了,如果执行
process子类
重写run方法,其它方法和proces方法一样
进程池pool 随用隧取,提高了效率
进程多了影响运行效率:
解决办法:再建一个模块,实时检测cpu和进程的运行状态,动态的
调整
queue==进程间通信----队列
特点:先进先出
目的:方便进程间管理
pool:1构造进程池(指定进程数量)默认回收,老爹死的时候带所有儿子
共赴黄泉---join()阻塞等待回收所有的子进程
调用完close()的时候,关闭进程池,不能再添加任务,
进程的通信:queue队列:
队列process使用了multiprecess queue
进程池使用manager中的queue
1.创建队列
2.我的子进程启动的时候,把队列传递到子进程中
3.A进程--》B进程,创建一个队列,B-->A再创建一个队列
queue使用方法:get put最后阻塞等待,2,put_nowait以判断空或者满
try捕获异常
线程部分
1.线程:进程中的代码流程
进程和线程的区别:
1.进程最小的资源分配单位,线程最小的任务调度单位
2.进程占有独立的资源,线程共享进程中的资源
3.进程创建和调度开销大,效率低,线程相反
4.线程依赖于进程,一个进程至少有一个线程
5.全局资源:线程不安全,进程安全
多线程threading
1.创建过程:1定义线程方法
2.实例化线程对象 target,args(,)启动线程,回收线程,线程的执行顺序:无序的,操作系统的调度造成的
2.全局变量:线程共享全局资源,线程之间通信方便,效率高,线程不安全(通过线程同步解决不安全)
3.互斥锁:
mutex = threading.Lock() 创建锁
mutex.acquire() 锁定
mutex.release() 释放
4.queue实现线程之间的通信,