Python学习笔记__10.4章 进程VS线程
# 这是学习廖雪峰老师python教程的学习笔记
1、概览
我们介绍了多进程和多线程,这是实现多任务最常用的两种方式。现在,我们来讨论一下这两种方式的优缺点
要实现多任务,通常我们会设计Master-Worker模式,Master负责分配任务,Worker负责执行任务,因此,多任务环境下,通常是一个Master,多个Worker。
如果用多进程实现Master-Worker,主进程就是Master,其他进程就是Worker。
如果用多线程实现Master-Worker,主线程就是Master,其他线程就是Worker。
1.1、多进程模式的优缺点
1)优点
稳定性高,因为一个子进程崩溃了,不会影响主进程和其他子进程。(当然主进程挂了所有进程就全挂了,但是Master进程只负责分配任务,挂掉的概率低)
2)缺点
创建进程的代价大,在Unix/Linux系统下,用fork调用还行,在Windows下创建进程开销巨大。另外,操作系统能同时运行的进程数也是有限的,在内存和CPU的限制下,如果有几千个进程同时运行,操作系统连调度都会成问题。
1.2、多线程模式的优缺点
1)优点
多线程模式通常比多进程快一点(只有一点点)。在Windows下,多线程的效率比多进程要高,所以微软的IIS服务器默认采用多线程模式。
2)缺点
致命的缺点就是任何一个线程挂掉都可能直接造成整个进程崩溃,因为所有线程共享进程的内存。由于多线程存在稳定性的问题,IIS的稳定性就不如Apache。
2、进程切换和线程切换
进程切换分两步,线程只做第2步:
切换页目录以使用新的地址空间
切换内核栈和硬件上下文。
线程上下文切换和进程上下文切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。
而无论进程/线程切换都要涉及到:
保存当前执行的现场环境(CPU寄存器状态、内存页等)
把新任务的执行环境准备好(恢复上次的寄存器状态,切换内存页等)
这个切换过程虽然很快,但是也需要耗费时间。如果有几千个任务同时进行,操作系统可能就主要忙着切换任务,根本没有多少时间去执行任务了。所以,多任务一旦多到一个限度,就会消耗掉系统所有的资源,结果效率急剧下降,所有任务都做不好。
3、计算密集型 vs. IO密集型
是否采用多任务的第二个考虑是任务的类型。我们可以把任务分为计算密集型和IO密集型。
3.1、计算密集型
要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。
计算密集型任务由于主要消耗CPU资源,因此,代码运行效率至关重要。Python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用C语言编写。
3.2、IO密集型
涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用。
IO密集型任务执行期间,99%的时间都花在IO上,花在CPU上的时间很少,因此,用运行速度极快的C语言替换用Python这样运行速度极低的脚本语言,完全无法提升运行效率。对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差。
4、异步IO
考虑到CPU和IO之间巨大的速度差异,一个任务在执行的过程中大部分时间都在等待IO操作,单进程单线程模型会导致别的任务无法并行执行,因此,我们才需要多进程模型或者多线程模型来支持多任务并发执行。
现代操作系统对IO操作已经做了巨大的改进,最大的特点就是支持异步IO。如果充分利用操作系统提供的异步IO支持,就可以用单进程单线程模型来执行多任务,这种全新的模型称为事件驱动模型,Nginx就是支持异步IO的Web服务器,它在单核CPU上采用单进程模型就可以高效地支持多任务。在多核CPU上,可以运行多个进程(数量与CPU核心数相同),充分利用多核CPU。由于系统总的进程数量十分有限,因此操作系统调度非常高效。用异步IO编程模型来实现多任务是一个主要的趋势。
对应到Python语言,单线程的异步编程模型称为协程,有了协程的支持,就可以基于事件驱动编写高效的多任务程序。
转载于:https://blog.51cto.com/12758568/2117005
Python学习笔记__10.4章 进程VS线程相关推荐
- 【Python学习笔记】第一章基础知识:格式化输出,转义字符,变量类型转换,算术运算符,运算符优先级和赋值运算符,逻辑运算符,世界杯案例题目,条件判断if语句,猜拳游戏与三目运算符
Python学习笔记之[第一章]基础知识 前言: 一.格式化输出 1.基本格式: 2.练习代码: 二.转义字符 1.基本格式: 2.练习代码: 3.输出结果: 三.输入 1.基本格式: 2.练习代码: ...
- Python学习笔记__13.2章 requests
# 这是学习廖雪峰老师python教程的学习笔记 相比于Python内置的urllib模块,使用requests可以更好地处理URL资源. 1.使用requests 1)通过GET访问一个页面 > ...
- Python学习笔记__6.1章 类和实例
# 这是学习廖雪峰老师python教程的学习笔记 1.概览 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一 ...
- Python学习笔记__1.5章 循环
# 这是学习廖雪峰老师python教程的学习笔记 1.for循环遍历 1.遍历名字 names = ['Michael', 'Bob', 'Tracy'] for name in names: pri ...
- Python学习笔记__4.1章 高阶函数
# 这是学习廖雪峰老师python教程的学习笔记 1.概览 我们知道Python内置的求绝对值的函数是abs() # 调用abs()函数可以获得一个值 >>> abs(-10) 10 ...
- Head First Python 学习笔记(第二章:分享你的代码)
共享你的代码 Python提供了一组技术,可以很容易地实现共享,这包括模块和一些发布工具: 模块允许你合力组织代码来实现最优共享. 发布工具允许你向全世界共享你的模块. 函数转换为模块 1.把第一章中 ...
- 深度之眼 - Python学习笔记——第四章 组合数据类型
第四章 组合数据类型 4.1 列表 列表是可变的! 4.1.1 列表的表达 序列类型:内部元素有位置关系,能通过位置序号访问其中元素 列表是一个可以使用多种类型元素,支持元素的增.删.查.改操作的序列 ...
- Python学习笔记 ---第三章
函数 函数是代码的一种抽象 函数 说明 abs 绝对值 max 最大值 hex 转换为16进制 强制数据类型转换 int('123') 123 int(12.35) 12 srt(100) '100' ...
- 【学习笔记】第二章——进程的控制、通信
文章目录 一. 进程控制 如何实现进程控制 创建 终止 阻塞 & 唤醒 切换 总结 二. 进程间的通信 定义 1)共享存储 2)管道通信 3)信息传递 总结 一. 进程控制 def: 实现进程 ...
最新文章
- Udacity机器人软件工程师课程笔记(三十三) - 蒙特卡洛定位算法(MCL)
- 无法执行 FunctionImport“entitys.xx”,因为未将它映射到存储函数。EF
- 开发者都想收藏的深度学习脑图,我们抢先曝光了!
- 数据算法——Spark的TopN实现
- mysql核心数据库_从MySQL基础进军MySQL核心架构 178集MySQL数据库核心基础视频教程 MySQL基础案例教程...
- java is alphabetic_JDK之Pattern类探索(一)
- linux启动顺序怎么修改,怎样修改启动顺序?
- Web项目性能优化之减少HTTP请求次数优化
- linux ftp图片服务器,linux ftp 图片服务器
- iOS开发:AFNetworking、MKNetworkKit和ASIHTTPRequest比较
- GCC在C语言中内嵌汇编 asm __volatile__
- 工程变更(ENGINEERING CHANGE)
- php中声明一个函数,php学习笔记之 函数声明
- 又要头秃?2020 年七大 AI 编程语言大盘点
- getCacheDir()和getFilesDir()方法区别
- Spring AspectJ简单测试代码
- SpringBoot集成Jsoup爬虫——三级列表
- Gitlab 回滚到某个commit
- 排名下降 流量减少 动态评分 服务 违规降权后,如何恢复搜索权重?
- 直角三角公式计算机,直角三角形中的一些常用公式.