理论讲解python多进程并发编程


Posted in Python onFebruary 09, 2018

一、什么是进程

进程:正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。

二、进程与程序的区别

程序:仅仅是一堆代

进程:是指打开程序运行的过程

三、并发与并行

并发与并行是指cpu运行多个程序的方式

不管是并行与并发,在用户看起来都是‘同时'运行的,他们都只是一个任务而已,正在干活的是cpu,而一个cpu只能执行一个任务。

并行就相当于有好多台设备,可以同时供好多人使用。

而并发就相当于只有一台设备,供几个人轮流用,每个人用一会就换另一个人。

所以只有多个cpu才能实现并行,而一个cpu只能实现实现并发。

理论讲解python多进程并发编程

如上图所示:

串行:执行完A,再执行B,再执行C

并行:同时执行ABC

并发:交替执行ABC

四、同步\异步

并发与并行是指cpu运行多个程序的方式,而同步和异步是指一个程序的执行过程

 同步:所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回。

按照这个定义,其实大部分函数都是同步调用,但是一般而言,我们说同步和异步的时候,

特指哪些需要其他部件协作或者需要一定时间完成的任务

异步:异步的概念和同步相对,当一个异步功能调用发出后,调用者不能立即得到结果

当该异步功能完成后,通过状态。通知或回调来通知调用者。如果异步功能用状态来通知,那么

调用者就需要每隔一定时间检查一次,效率就回很低,如果使用通知的方式,效率就回很高,

因为异步功能几乎不需要做额外的操作,至于回调函数,其实和通知没太大区别。

五、阻塞\非阻塞

阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到IO操作)。

函数只有得到结果之后才会被阻塞的线程激活。

非阻塞:非阻塞和阻塞的概念相对,指在不能立即得到结果之前也会立即返回,同时该函数不会阻塞当前线程

小结:同步与异步针对的是函数\任务的调用方式:同步就是当一个进程发起一个函数调用的时候,一直等到函数\任务完成,

而进程继续处于激活状态。而异步情况下是当一个进程发起一个函数|任务调用的时候,不会等函数返回,而继续往下执行,

函数返回的时候通过状态、通知、时间等方式通知进程任务完成

而阻塞和非阻塞是针对进程或者线程,阻塞是当请求不能满足的时候就挂起,而非阻塞则不会阻塞当前的进程

六、进程的创建与终止(了解)

进程的创建:

但凡是硬件,都需要有操作系统去管理,只要有操作系统,就有进程的概念,就需要有创建进程的方式,一些操作系统只为一个应用程序设计,比如微波炉中的控制器,一旦启动微波炉,所有的进程都已经存在。

而对于通用系统(跑很多应用程序),需要有系统运行过程中创建或撤销进程的能力,主要分为4中形式创建新的进程

1. 系统初始化(查看进程linux中用ps命令,windows中用任务管理器,前台进程负责与用户交互,后台运行的进程与用户无关,运行在后台并且只在需要时才唤醒的进程,称为守护进程,如电子邮件、web页面、新闻、打印)

2. 一个进程在运行过程中开启了子进程(如nginx开启多进程,os.fork,subprocess.Popen等)

3. 用户的交互式请求,而创建一个新进程(如用户双击暴风影音)

4. 一个批处理作业的初始化(只在大型机的批处理系统中应用)

无论哪一种,新进程的创建都是由一个已经存在的进程执行了一个用于创建进程的系统调用而创建的:

1. 在UNIX中该系统调用是:fork,fork会创建一个与父进程一模一样的副本,二者有相同的存储映像、同样的环境字符串和同样的打开文件(在shell解释器进程中,执行一个命令就会创建一个子进程)

2. 在windows中该系统调用是:CreateProcess,CreateProcess既处理进程的创建,也负责把正确的程序装入新进程。

关于创建的子进程,UNIX和windows

1.相同的是:进程创建后,父进程和子进程有各自不同的地址空间(多道技术要求物理层面实现进程之间内存的隔离),任何一个进程的在其地址空间中的修改都不会影响到另外一个进程。

2.不同的是:在UNIX中,子进程的初始地址空间是父进程的一个副本,提示:子进程和父进程是可以有只读的共享内存区的。但是对于windows系统来说,从一开始父进程与子进程的地址空间就是不同的。

进程的终止:

1. 正常退出(自愿,如用户点击交互式页面的叉号,或程序执行完毕调用发起系统调用正常退出,在linux中用exit,在windows中用ExitProcess)

2. 出错退出(自愿,python a.py中a.py不存在)

3. 严重错误(非自愿,执行非法指令,如引用不存在的内存,1/0等,可以捕捉异常,try...except...)

4. 被其他进程杀死(非自愿,如kill -9)

七、进程的层次结构

无论UNIX还是windows,进程只有一个父进程,不同的是:

1. 在UNIX中所有的进程,都是以init进程为根,组成树形结构。父子进程共同组成一个进程组,这样,当从键盘发出一个信号时,该信号被送给当前与键盘相关的进程组中的所有成员。

2. 在windows中,没有进程层次的概念,所有的进程都是地位相同的,唯一类似于进程层次的暗示,是在创建进程时,父进程得到一个特别的令牌(称为句柄),该句柄可以用来控制子进程,但是父进程有权把该句柄传给其他子进程,这样就没有层次了。

八、进程的状态

其实在两种情况下会导致一个进程在逻辑上不能运行,

1. 进程挂起是自身原因,遇到I/O阻塞,便要让出CPU让其他进程去执行,这样保证CPU一直在工作

2. 与进程无关,是操作系统层面,可能会因为一个进程占用时间过多,或者优先级等原因,而调用其他的进程去使用CPU。

因而一个进程由三种状态

理论讲解python多进程并发编程

Python 相关文章推荐
python使用calendar输出指定年份全年日历的方法
Apr 04 Python
Django中URL视图函数的一些高级概念介绍
Jul 20 Python
Python使用add_subplot与subplot画子图操作示例
Jun 01 Python
python3.7.0的安装步骤
Aug 27 Python
python识别文字(基于tesseract)代码实例
Aug 24 Python
详解python uiautomator2 watcher的使用方法
Sep 09 Python
Python检查图片是否损坏及图片类型是否正确过程详解
Sep 30 Python
wxPython实现整点报时
Nov 18 Python
pyecharts动态轨迹图的实现示例
Apr 17 Python
pycharm导入源码的具体步骤
Aug 04 Python
Python 列表推导式需要注意的地方
Oct 23 Python
Python 实现集合Set的示例
Dec 21 Python
Python装饰器(decorator)定义与用法详解
Feb 09 #Python
详解python的ORM中Pony用法
Feb 09 #Python
python监控键盘输入实例代码
Feb 09 #Python
Python with语句上下文管理器两种实现方法分析
Feb 09 #Python
Python遍历pandas数据方法总结
Feb 09 #Python
python中的闭包函数
Feb 09 #Python
基于Python socket的端口扫描程序实例代码
Feb 09 #Python
You might like
Php中文件下载功能实现超详细流程分析
2012/06/13 PHP
Zend Framework教程之Application和Bootstrap用法详解
2016/03/10 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
Yii2框架类自动加载机制实例分析
2018/05/02 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
javascript数组去掉重复
2011/05/12 Javascript
利用js正则表达式验证手机号,email地址,邮政编码
2014/01/23 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
Jquery实现顶部弹出框特效
2015/08/08 Javascript
jQuery实现移动端滑块拖动选择数字效果
2015/12/24 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
2016/11/03 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
[02:13] 完美世界DOTA2联赛PWL DAY5集锦
2020/11/03 DOTA
PyCharm在win10的64位系统安装实例
2017/11/26 Python
python开启摄像头以及深度学习实现目标检测方法
2018/08/03 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
django3.02模板中的超链接配置实例代码
2020/02/04 Python
Pytorch 使用 nii数据做输入数据的操作
2020/05/26 Python
日本面向世界,国际级的免税在线购物商城:DOKODEMO
2017/02/01 全球购物
教师自荐信
2013/12/10 职场文书
物业工作计划书
2014/01/10 职场文书
市级绿色学校申报材料
2014/08/25 职场文书
2016党员党课心得体会
2016/01/07 职场文书
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
2021/05/25 MySQL
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript