理论讲解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程序中使用Cookie的教程
Apr 30 Python
浅谈Python由__dict__和dir()引发的一些思考
Oct 30 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
Apr 22 Python
Python获取指定字符前面的所有字符方法
May 02 Python
Python实现获取汉字偏旁部首的方法示例【测试可用】
Dec 18 Python
浅谈Python 列表字典赋值的陷阱
Jan 20 Python
Django中使用Whoosh进行全文检索的方法
Mar 31 Python
django创建超级用户过程解析
Sep 18 Python
python实现发送form-data数据的方法详解
Sep 27 Python
Python实现括号匹配方法详解
Feb 10 Python
python itsdangerous模块的具体使用方法
Feb 17 Python
python归并排序算法过程实例讲解
Nov 04 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结合正则批量抓取网页中邮箱地址
2015/05/19 PHP
PHP程序员的技术成长规划
2016/03/25 PHP
浅谈PHP中的数据传输CURL
2016/09/06 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
Nigma vs Liquid BO3 第一场2.13
2021/03/10 DOTA
在线编辑器的实现原理(兼容IE和FireFox)
2007/03/09 Javascript
js/jquery去掉空格,回车,换行示例代码
2013/11/05 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
2014/10/14 Javascript
JavaScript学习笔记之Cookie对象
2015/01/22 Javascript
Jquery 实现table样式的设定
2015/01/28 Javascript
分享一个插件实现水珠自动下落效果
2016/06/01 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
JS表单提交验证、input(type=number) 去三角 刷新验证码
2017/06/21 Javascript
微信小程序实现自定义picker选择器弹窗内容
2020/05/26 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
2020/01/18 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
2020/06/02 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
Python探索之URL Dispatcher实例详解
2017/10/28 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
使用Python-OpenCV消除图像中孤立的小区域操作
2020/07/05 Python
CSS改变网页中鼠标选中文字背景颜色例子
2014/04/23 HTML / CSS
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
出国留学自荐信
2013/10/25 职场文书
元旦活动感言
2014/03/08 职场文书
综合内勤岗位职责
2014/04/14 职场文书
我的中国梦演讲稿300字
2014/08/19 职场文书
课内比教学心得体会
2014/09/09 职场文书
音乐教育专业自荐信
2014/09/18 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
2014年人事部工作总结
2014/12/03 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书
Python OpenCV超详细讲解读取图像视频和网络摄像头
2022/04/02 Python
golang连接MySQl使用sqlx库
2022/04/14 Golang