将OneNote笔记与Word文档链接的两种方法(onenote怎样打开word文档)
545
2022-05-29
多任务编程
利用多进程与多线程提高程序运行效率(充分利用cpu多核资源,同时处理多个应用程序任务)
进程 process
理论:
定义:程序在计算机中的一次运行
程序是一个可执行的文件,占有磁盘
进程是一个动态过程的描述,占有内存资源,有一定的生命周期
系统如何产生一个进程?
用户调用命令发起请求(命令窗口输入命令)
用户调用程序接口(点击图标这个过程)
系统接收用户请求,开始创建进程(点开图标后系统该干的事)
系统将创建的进程提供用户使用(点开图标后系统该干的事)
系统调配计算机资源,确定进程状态等(开机或点开图标后系统该干的事)
进程基本概念:
cpu时间片:一个进程占有cpu内核说明这个进程在cpu时间片上
pcb(进程控制块):用于存放进程的基本信息,用于系统查找并识别进程,存放在内存中
进程id(pid):系统为每一个进程分配一个大于0的整数,作为进程id,每个进程id不重复
父子进程:系统中每一个进程(除了系统初始化进程)都有唯一的父进程,可以有多个子进程,父子进程关系便于进程管理
进程状态 1.就绪态:等待分配cpu,进程具备执行条件 2.运行态:进程占有cpu时间片 3等待态:让出cpu,停止运行 4.新建:创建一个进程,获取资源 5.终止:进程结束,释放资源
进程的运行状态:1.多进程可以跟充分使用计算机多核资源 2.进程之间的运行互不影响,互相独立 3.每个进程拥有独立的空间,各子使用自己空间资源
基于fork的多进程编程
fork的使用
pid = os.fork() ''' 功能:获取进程的pid值 返回值:成功会在原有进程返回新进程的pid新进程返回0,失败会返回一个负数 '''
注意:
子进程会复制父进程全部内存空间,从fork下一句代码开始执行
父子进程各自独立运行,运行不一定有顺序
利用父子进程fork返回值的区别,配合if让父子进程执行不同的内容,但还是固定的搭配
父子进程有各自特有特征
父进程fork之前开辟的空间子进程同样拥有,但对各自空间的操作互不影响
进程相关函数
os.getpid() ''' 功能:获取一个进程的pid 返回值:返回当前进程的pid ''' os.getppid() ''' 功能:获取父进程的pid 返回值:返回父进程的pid ''' os._exit(status) ''' 功能:结束一个进程 参数:进程的终止状态 ''' sys.exit([status]) ''' 功能:推出进程 参数:整数,表示推出状态 字符串:表示推出时打印内容 '''
孤儿与僵尸
孤儿:父进程比子进程退出的更早,子进程变成孤儿进程,孤儿进程被系统进程收养,系统进程变成父进程,孤儿进程会自动推出系统进程
僵尸:子进程比父进程退出的跟早,父进程没有处理子进程的退出状态,此时的子进程为僵尸进程,僵尸进程会残留部分pcbzai内存中,浪费内存
避免僵尸进程:
wait函数
pid, status = os.wait() ''' 功能:在父进程中阻塞等待处理僵尸进程 返回值:pid 推出的子进程的pid status 子进程是否退出 '''
二级子进程
父进程创建子进程,等待回收
子进程创建二级子进程后退出
二级子进程为孤儿,和父进程一起执行
通过信号处理子进程退出
import singal singal.singal(singal.SIGCHLD,singal.SIG_IGN) ''' 原理:子进程退出时会发信号给父进程,如果父进程忽略子进程信号,系统会自动处理子进程 特点:不会影响父进程运行,可以处理所有子程序退出 '''
multprocessing模块创建进程
进程创建
'''基本接口''' Process() ''' 功能:创建进程对象 参数:target绑定要执行的目标函数,args元组用于给target函数位置传参,kwargs字典,给target函数键值传参 ''' p.join([timeout]) ''' 功能:阻塞等待回收进程 参数:超时时间 ''' p.start() ''' 功能:启动进程,此时target绑定函数开始执行,此函数作为子程序执行内容,此时进程正真被创建 '''
流程:
将子进程执行的事件封装为函数
通过模块的Process类创建进程对象,关联函数
通过进程对象调用start启动进程
通过进程对象调用join回收进程
p.name //进程名 p.pid //对应子进程的pid号 p.is_alive() //查看子进程是否在生命周期 p.daemon //设置父子进程的退出关系 ''' 如果设置为True则子进程会随父进程的退出而结束 要求必须在start()前设置 如果deamon设置成True 通常就不会使用join() '''
注意:
使用mutiprocess创建进程同样是子进程复制父进程空间代码段,父子进程运行互不影响
子进程只运行target绑定的函数部分,其余内容均是父进程执行内容
mutiprocessing中父进程往往只用来创建子进程回收子进程,具体事件由子进程完成
mutiprocessing创建的子进程中无法使用标准输入
自定义进程类
1创建步骤:继承process类,重写_init_函数添加自己的属性,使用super()添加父类属性,重写run()方法
2使用方法:实例化对象,调用start自动执行run方法,调用join回收线程
进程池实现
1必要性
进程的创建和销毁过程消耗资源较多
当任务量众多,每个任务在很短时间内完成时,需要频繁的创建与销毁进程,此时计算机压力较大
2原理:创建一定数量的进程来处理事件,事件处理完后,进程继续处理其他事件,直到所有事件都处理完毕统一销毁
from multiprocessing import Pool Pool(processes) ''' 功能:创建进程池对象 参数:指定进程数量,默认根据系统自动判定 ''' pool.apply_async(func,args,kwds) ''' 功能:使用进程池执行func事件 参数:func 事件函数,args元组 给func按位置传参,kwds字典 给func按照键值传参 返回值:返回函数事件对象 ''' pool.close() ''' 功能:关闭进程池 ''' pool.join() ''' 功能:回收进程池中进程 '''
多线程
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。