并发编程笔记1】

网友投稿 545 2022-05-29

多任务编程

利用多进程与多线程提高程序运行效率(充分利用cpu多核资源,同时处理多个应用程序任务)

进程  process

理论:

定义:程序在计算机中的一次运行

程序是一个可执行的文件,占有磁盘

进程是一个动态过程的描述,占有内存资源,有一定的生命周期

系统如何产生一个进程?

用户调用命令发起请求(命令窗口输入命令)

用户调用程序接口(点击图标这个过程)

系统接收用户请求,开始创建进程(点开图标后系统该干的事)

系统将创建的进程提供用户使用(点开图标后系统该干的事)

系统调配计算机资源,确定进程状态等(开机或点开图标后系统该干的事)

进程基本概念:

并发编程 【笔记1】

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小时内删除侵权内容。

上一篇:Spring Boot 中自定义 SpringMVC 配置,到底继承谁?
下一篇:第十七届智能汽车竞赛智能视觉组数据集发布
相关文章