并发编程 【笔记1】
【摘要】 多任务编程利用多进程与多线程提高程序运行效率(充分利用cpu多核资源,同时处理多个应用程序任务)进程 process理论:定义:程序在计算机中的一次运行程序是一个可执行的文件,占有磁盘进程是一个动态过程的描述,占有内存资源,有一定的生命周期系统如何产生一个进程?用户调用命令发起请求(命令窗口输入命令)用户调用程序接口(点击图标这个过程)系统接收用户请求,开始创建进程(点开图标后系统该干的事...
多任务编程
利用多进程与多线程提高程序运行效率(充分利用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()
'''
功能:回收进程池中进程
'''
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)