Python中进程和线程的区别详解


Posted in Python onOctober 29, 2017

Num01?>线程

线程是操作系统中能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

一个线程指的是进程中一个单一顺序的控制流。

一个进程中可以并发多条线程,每条线程并行执行不同的任务。

Num02?>进程

进程就是一个程序在一个数据集上的一次动态执行过程。

进程有以下三部分组成:

1,程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成。
2,数据集:数据集则是程序在执行过程中需要的资源,比如图片、音视频、文件等。
3,进程控制块:进程控制块是用来记录进程的外部特征,描述进程的执行变化过程,系统可以用它来控制和管理进程,它是系统感知进程存在的唯一标记。

Num03?>进程和线程的区别:

1、运行方式不同:

进程不能单独执行,它只是资源的集合。

进程要操作CPU,必须要先创建一个线程。

所有在同一个进程里的线程,是同享同一块进程所占的内存空间。

2,关系

进程中第一个线程是主线程,主线程可以创建其他线程;其他线程也可以创建线程;线程之间是平等的。

进程有父进程和子进程,独立的内存空间,唯一的标识符:pid。

3,速度

启动线程比启动进程快。

运行线程和运行进程速度上是一样的,没有可比性。

线程共享内存空间,进程的内存是独立的。

4,创建

父进程生成子进程,相当于复制一份内存空间,进程之间不能直接访问

创建新线程很简单,创建新进程需要对父进程进行一次复制。

一个线程可以控制和操作同级线程里的其他线程,但是进程只能操作子进程。

5,交互

同一个进程里的线程之间可以直接访问。

两个进程想通信必须通过一个中间代理来实现。

Num04?>几个常见的概念

1,什么的并发和并行?

并发:微观上CPU轮流执行,宏观上用户看到同时执行。因为cpu切换任务非常快。

并行:是指系统真正具有同时处理多个任务(动作)的能力。

2,同步、异步和轮询的区别?

同步任务:B一直等着A,等A完成之后,B再执行任务。(打电话案例)

轮询任务:B没有一直等待A,B过一会来问一下A,过一会问下A

异步任务:B不需要一直等着A, B先做其他事情,等A完成后A通知B。(发短信案例)

Num05?>进程和线程的优缺点比较

首先,要实现多任务,通常我们会设计Master-Worker模式,Master负责分配任务,Worker负责执行任务,因此,多任务环境下,通常是一个Master,多个Worker。

如果用多进程实现Master-Worker,主进程就是Master,其他进程就是Worker。

如果用多线程实现Master-Worker,主线程就是Master,其他线程就是Worker。

多进程模式最大的优点就是稳定性高,因为一个子进程崩溃了,不会影响主进程和其他子进程。(当然主进程挂了所有进程就全挂了,但是Master进程只负责分配任务,挂掉的概率低)著名的Apache最早就是采用多进程模式。

多进程模式的缺点是创建进程的代价大,在Unix/Linux系统下,用fork调用还行,在Windows下创建进程开销巨大。另外,操作系统能同时运行的进程数也是有限的,在内存和CPU的限制下,如果有几千个进程同时运行,操作系统连调度都会成问题。

多线程模式通常比多进程快一点,但是也快不到哪去,而且,多线程模式致命的缺点就是任何一个线程挂掉都可能直接造成整个进程崩溃,因为所有线程共享进程的内存。在Windows上,如果一个线程执行的代码出了问题,你经常可以看到这样的提示:“该程序执行了非法操作,即将关闭”,其实往往是某个线程出了问题,但是操作系统会强制结束整个进程。

在Windows下,多线程的效率比多进程要高,所以微软的IIS服务器默认采用多线程模式。由于多线程存在稳定性的问题,IIS的稳定性就不如Apache。为了缓解这个问题,IIS和Apache现在又有多进程+多线程的混合模式,真是把问题越搞越复杂。

Num06?>计算密集型任务和IO密集型任务

    是否采用多任务的第二个考虑是任务的类型。我们可以把任务分为计算密集型和IO密集型。

    第一种:计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。

计算密集型任务由于主要消耗CPU资源,因此,代码运行效率至关重要。Python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用C语言编写。

    第二种:任务的类型是IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用。

IO密集型任务执行期间,99%的时间都花在IO上,花在CPU上的时间很少,因此,用运行速度极快的C语言替换用Python这样运行速度极低的脚本语言,完全无法提升运行效率。对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差。

总结

以上所述是小编给大家介绍的Python中进程和线程的区别,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
Python的Socket编程过程中实现UDP端口复用的实例分享
Mar 19 Python
Python win32com 操作Exce的l简单方法(必看)
May 25 Python
python不换行之end=与逗号的意思及用途
Nov 21 Python
python实现动态创建类的方法分析
Jun 25 Python
Python使用APScheduler实现定时任务过程解析
Sep 11 Python
pip 安装库比较慢的解决方法(国内镜像)
Oct 06 Python
django model通过字典更新数据实例
Apr 01 Python
python 生成任意形状的凸包图代码
Apr 16 Python
浅谈matplotlib中FigureCanvasXAgg的用法
Jun 16 Python
使用OpenCV实现人脸图像卡通化的示例代码
Jan 15 Python
用Python提取PDF表格的方法
Apr 11 Python
python生成可执行exe控制Microsip自动填写号码并拨打功能
Jun 21 Python
python logging日志模块的详解
Oct 29 #Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
Oct 29 #Python
Python批量更改文件名的实现方法
Oct 29 #Python
python生成二维码的实例详解
Oct 29 #Python
python 读写中文json的实例详解
Oct 29 #Python
Python3 处理JSON的实例详解
Oct 29 #Python
深入理解Python中的*重复运算符
Oct 28 #Python
You might like
IIS+PHP+MySQL+Zend配置 (视频教程)
2006/12/13 PHP
PHP缓存技术的多种方法小结
2012/08/14 PHP
php弹出对话框实现重定向代码
2014/01/23 PHP
php字符串替换函数substr_replace()用法实例
2015/03/17 PHP
ZendFramework框架实现连接两个或多个数据库的方法
2016/12/08 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
js event事件的传递与冒泡处理
2009/12/06 Javascript
Js中setTimeout()和setInterval() 何时被调用执行的用法
2013/04/12 Javascript
js运动框架_包括图片的淡入淡出效果
2013/05/11 Javascript
jquery实现盒子下拉效果示例代码
2013/09/12 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
bootstrapValidator.min.js表单验证插件
2017/02/09 Javascript
简单的网页广告特效实例
2017/08/19 Javascript
在页面中引入js的两种方法(推荐)
2017/08/29 Javascript
vue实现文章内容过长点击阅读全文功能的实例
2017/12/28 Javascript
详解浏览器缓存和webpack缓存配置
2018/07/06 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
2018/08/17 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
vue实现列表拖拽排序的功能
2020/11/02 Javascript
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
使用Python实现博客上进行自动翻页
2017/08/23 Python
python微信跳一跳系列之色块轮廓定位棋盘
2018/02/26 Python
python计算两个地址之间的距离方法
2018/06/09 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
基于Python实现人脸自动戴口罩系统
2020/02/06 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
2020/03/24 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
巴西最大的珠宝连锁店:Vivara
2019/04/18 全球购物
英国电子产品购物网站:Tech in the basket
2019/11/08 全球购物
经济管理毕业生求职信
2014/03/15 职场文书
行政执法队伍作风整顿个人剖析材料
2014/10/11 职场文书
夫妻忠诚协议范文
2014/11/16 职场文书
2016教师给学生的毕业寄语
2015/12/04 职场文书