现在多进程多线程已经是老生常谈了,协程也在最近几年流行起来。python中有协程库gevent,py web框架tornado中也用了gevent封装好的协程。本文主要介绍进程、线程和协程三者之间的区别。

一、概念

1、进程

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。

2、线程

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。

3、协程

协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

二、区别:

1、进程多与线程比较

线程是指进程内的一个执行单元,也是进程内的可调度实体。线程与进程的区别:

1) 地址空间:线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间

2) 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源

3) 线程是处理器调度的基本单位,但进程不是

4) 二者均可并发执行

5) 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

2、协程多与线程进行比较

1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程,这样python中则能使用多核CPU。

2) 线程进程都是同步机制,而协程则是异步

3) 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态

三、进程和线程、协程在python中的使用

1、多进程一般使用multiprocessing库,来利用多核CPU,主要是用在CPU密集型的程序上,当然生产者消费者这种也可以使用。多进程的优势就是一个子进程崩溃并不会影响其他子进程和主进程的运行,但缺点就是不能一次性启动太多进程,会严重影响系统的资源调度,特别是CPU使用率和负载。使用多进程可以查看文章《python 多进程使用总结》。注:python2的进程池在类中的使用会有问题,需要把类函数定义成全局函数。具体可参考 http://bbs.chinaunix.net/thread-4111379-1-1.html

2、多线程一般是使用threading库,完成一些IO密集型并发操作。多线程的优势是切换快,资源消耗低,但一个线程挂掉则会影响到所有线程,所以不够稳定。现实中使用线程池的场景会比较多,具体可参考《python线程池实现》。

3、协程一般是使用gevent库,当然这个库用起来比较麻烦,所以使用的并不是很多。相反,协程在tornado的运用就多得多了,使用协程让tornado做到单线程异步,据说还能解决C10K的问题。所以协程使用的地方最多的是在web应用上。

总结一下就是IO密集型一般使用多线程或者多进程,CPU密集型一般使用多进程,强调非阻塞异步并发的一般都是使用协程,当然有时候也是需要多进程线程池结合的,或者是其他组合方式。

python线程协程进程的区别_进程和线程、协程的区别相关推荐

  1. python进程线程协程区别_进程和线程、协程的区别

    现在多进程多线程已经是老生常谈了,协程也在最近几年流行起来.python中有协程库gevent,py web框架tornado中也用了gevent封装好的协程.本文主要介绍进程.线程和协程三者之间的区 ...

  2. 操作系统的线程和进程的区别_进程,线程,协程,有何区别?

    进程 ​ cpu是计算机的核心,主要处理计算机的计算任务.操作系统是计算机的管理员,它负责任务的调度,资源的管理和分配,统一管理计算机的硬件资源.应用程序则是具有某种功能的程序,应用程序运行于操作系统 ...

  3. python 线程通信的几种方式_进程间通信和线程间通信的几种方式

    进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代 ...

  4. JAVA线程池_并发队列工作笔记0003---线程池的分类_可缓存线程池_定长线程池_定时线程池_单例线程池

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这里说线程池的分类 有可缓存类型, 定长类型, 定时类型, 单例类型, 这里我这次用Executo ...

  5. taskkill无法终止进程 拒绝访问_进程的基本概念

    程序顺序执行的特征 程序并发执行的特性 进程的特征 进程的状态及转换 进程的三种基本状态 创建和终止状态 进程状态的转换 进程管理中的数据结构 进程控制块PCB的作用 进程控制块中的信息 进程控制块的 ...

  6. Java线程池状态判断源码_深入浅出Java线程池:源码篇

    前言 在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用.(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适).本文则深入线程池的源码,主要是介绍Thr ...

  7. java同步异步区别_同步请求和异步请求的区别

    同步请求和异步请求的区别 先解释一下同步和异步的概念 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式. 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的 ...

  8. hashmap是线程安全的吗?怎么解决?_解决SimpleDateFormat线程安全问题

    SimpleDateFormat是线程不安全的类,一般不要定义为static变量,如果定义为static,必须通过加锁等方式保证线程安全. 例如下面一段代码,启动10个线程,同时使用一个`Simple ...

  9. 网和aoe网的区别_运动内衣与普通内衣有什么区别?运动内衣里面还需要穿文胸吗? 小家生活网20201002 11:03:04...

    阅读本文前,请您先点击上面的"蓝色字体可以说爱情就是他们最大的软肋.不会在双鱼女那出现.在对于周边的亲戚时.她们那种温柔大方的气势.更符合妈妈的需求.整双腿没有视觉连贯性.但唯独感情这件事一 ...

最新文章

  1. python使用imbalanced-learn的InstanceHardnessThreshold方法进行下采样处理数据不平衡问题
  2. 检测到磁盘可能为uefi引导_重装系统win10提示磁盘布局不受UEFI固件支持怎么办...
  3. Java中多线程概念详解
  4. 顶级俄国数学家是怎样炼成的?[2016-06-25 张羿 赛先生]
  5. 使用精确的Java方法参数
  6. SSL / TLS REST服务器–带有Spring和TomEE的客户端
  7. flume avro java 发送数据_flume将数据发送到kafka、hdfs、hive、http、netcat等模式的使用总结...
  8. html宽度自动填充,html – 创建一个td填充表宽度
  9. vue 工作项目中 实现消息列表的 全选,反选,删除功能
  10. 【数字基带信号】基于matlab数字双相码仿真【含Matlab源码 989期】
  11. 为什么acdsee服务器怎在运行,为何打开网页时会出现安装acdsee 5.0.1 powerpack
  12. Mac和Windows系统中ssh密钥的生成和共享
  13. 改革IMF首先要增加中国发言权
  14. 【小程序】扫码预览时不显示图片
  15. 基于TCP的通信为什么需要RETRY
  16. 从微软官网下载原版系统/中文系统/英文系统
  17. Cacheable、CacheEvict、Caching使用示例
  18. 游戏设计自学记录(27)
  19. 读书/纪录片笔记:《手术两百年》
  20. pso算法matlab程序,基本PSO算法的matlab源程序

热门文章

  1. Harmony Native开发-我的OpenSL ES录音机
  2. wampserver----------如何设置wampserver在windows下开机自动启动。
  3. Windows下使用Rtools编译R语言包
  4. react styled-components插件完成独立组件css样式(js重构css写法)
  5. C语言—选择结构总结
  6. C语言 define 定义函数 - C语言零基础入门教程
  7. 【Android自动化测试】Robot Framework+adb框架(五)——L1层测试用例
  8. java读取json文本及jsonArray的使用
  9. Android性能优化系列:CPU收敛优化(线程优化)
  10. k8s教程(pod篇)-定向调度