0.前言

在计算机技术领域,吞吐量(throughput)是计算机在指定的一段时间内完成编程技术如何影响。本文主要讨论Python的多进程、多线程及协程等编程技术在不同场景下对系统吞吐量的影响。

1.CPU消耗型任务、I/O消耗型任务

计算机执行的任务分为CPU消耗型任务和I/O消耗型任务:

1.1 CPU消耗型任务:

大部分时间用来执行代码指令,在该任务执行期间,需要持续消耗处理器资源。除非被抢占或者时间片用尽,否则它们通常会一直运行。

1.2 I/O消耗型任务:

大部分时间用来提交I/O请求或者等待I/O请求。

外设的访问速度要远远慢于CPU速度,因而CPU在进行I/O操作时,不是马上可以获取I/O的数据,常常需要等待I/O。根据I/O等待方式的不同,I/O操作可以分为 阻塞I/O、非阻塞式I/O、I/O复用(select,poll,epoll,…)、信号驱动式I/O(SIGIO)、异步I/O(POSIX的aio_系列函数)

以下是几种I/O访问方式的概述阻塞I/O:

阻塞I/O的执行流程简述:

(1)申请后去I/O数据,内核缓冲区为空,进程阻塞,等待数据到达,然后复制到内核缓冲区域。

(2)将数据从内核缓冲区复制到应用程序缓冲区,然后进程结束阻塞

进程在获得I/O数据前一直阻塞非阻塞I/O:

进程不阻塞,一直采用轮询的方式,直到I/O数据准备好I/O多路复用:

I/O多路复用的函数也是阻塞的,但I/O多路复用是阻塞在select,epoll这样的系统调用上,而不是阻塞在I/O系统调用上。信号驱动式I/O:

进程通过信号与内核交互,内核缓冲区准备好I/O数据(期间,进程继续执行),然后数据从内核缓冲区拷贝到进程(期间进程阻塞),数据拷贝完成,进程阻塞结束异步I/O:

告知内核获取I/O数据,内核执行操作,完成操作后通知数据拷贝完成,进程读取数据。

讨论I/O操作时,经常会讨论两对概念:阻塞和非阻塞 、同步和异步

阻塞/非阻塞:进程访问数据时,数据没有就绪,进程是否需要等待,需要等待就是阻塞,反之就是非阻塞

同步/异步:同步需要进程主动读写数据,读写过程中会发生阻塞;异步只需要I/O操作完成的通知,不主动读写数据,交给操作系统内核完成数据读写。

上面讨论的I/O操作,阻塞I/O、非阻塞I/O、I/O多路复用、信号驱动式I/O都是同步的,只有异步I/O是属于异步的。

1.3 任务性质与多进程、多线程及协程

进程与线程比较类似,线程又称之为轻量级进程,一般认为线程在进程内部,是操作系统调度的基本单位,与进程共享地址空间、资源,但拥有自己独立的线程。

协程常被称为微线程,但协程不同于线程。

(1)调度方法不同,线程切换的上下文由操作系统内核保存和恢复,而协程在用户态保存和恢复,显然协程调度的代价要小的多。

(2)线程可以抢占,而协程不可以抢占,协程是通过让出CPU来实现调度的。

(3)协程占用更少的内存资源,只需要栈空间,而线程需要更多资源。

其实,从操作系统的角度看,协程只是单线程,通过让出CPU实现协程间切换,一次只有一个协程在执行,而多线程如果运行在多核CPU上,可以同时运行多个线程。单核CPU、多CPU消耗型任务

由于单核CPU,即使多进程/多线程,同一时间依旧只有一个进程可以执行操作,而CPU消耗型任务主要是执行指令,并且进程切换过程中需要消耗系统资源,多进程/多线程在这种情况下反而不如单进程效率高。而使用协程的情况与单线程的情况很相近,虽然协程比线程切换的消耗小,但是在CPU消耗型任务中,线程切换次数相对少,所以协程与线程效率也会比较相近。

多核CPU、多CPU消耗型任务

多核CPU下,可以同时运行多个进程/线程,实现CPU消耗型任务的并行计算,此时多进程/线程性能优于单进程/单线程。此时使用协程与单线程情况比较类似,效率同样会低于多进程/多线程。

单核CPU、多I/O消耗型任务

由于单核CPU,即使多进程/多线程,同一时间依旧只有一个进程可以执行操作,但是I/O消耗型任务经常会阻塞进程,此时其他进程可以被调度,合理利用这段CPU时间,虽然进程调度也会消耗资源,但是CPU时间利用更充分了,此时多进程/多线程性能应该是优于单进程/单线程。多I/O消耗型任务执行过程中,线程调度会更频繁一些,而协程调度消耗更低,所以协程执行效率应该是高于线程的。

多核CPU、多I/O消耗型任务

这种情况下显而易见,多进程/多线程性能会优于单进程。由于涉及到多核CPU,线程可以并行执行,线程的性能要高于协程。

2.Python中的进程、线程、协程

Python中的进程、线程及协程与上文讨论的进程、线程及协程在概念上是一样的,但实际上,Python中的线程与传统意义上讲的线程又不同。

CPython中有个GIL(Global Interpretor Lock)。顾名思义,就是Python解释器的一个全局锁。由于GIL的存在,Python的多线程即使在多核CPU上也不能并行运行,又有获得GIL锁的进程才能执行,也就是一个时间下只有一个线程在执行。一方面,线程切换的代价要比协程切换的代价大(线程由操作系统内核调度,协程调度发生在用户态),单从线程/协程切换的代价考虑,协程要比线程性能更好,但是另一方面,协程本质上是一个线程,而多线程技术是多个线程,多个线程被操作系统调度到的可能性要大于协程单个线程的可能性,这也会影响运行性能。综合上面两个方面Python在系统资源不紧张的情况下, Python线程与协程的性能可能是比较相近的。

对于多核CPU系统,需要并行运行线程的,可以用multiprocessing模块使用进程。

python 协程、进程、线程_Python的进程、线程和协程 · Donzy’s Blogs相关推荐

  1. python守护进程进程池_Python—守护进程管理工具(Supervisor)

    一.前言简介 1.Supervisor 是一个 Python 开发的 client/server 系统,可以管理和监控类 UNIX 操作系统上面的进程.可以很方便的用来启动.重启.关闭进程(不仅仅是 ...

  2. python销毁线程_Python 中的线程

    封面图片来源:沙沙野 线程线程与进程的联系:都是为了解决并发 线程与进程的区别:进程:计算机中最小的资源分配单位 线程:进程中的一员,同一个进程之间的几个线程共享一个进程的资源 线程可以直接被CPU调 ...

  3. python守护线程_Python之守护线程与锁

    # 守护线程随着子线程结束而结束,与守护进程不一样--守护进程随着主进程代码执行完毕而结束 # from threading import Thread # import time # # def f ...

  4. win python 判断 所有 子进程 结束_python 多进程 进程池子进程结束怎么获取

    匿名用户 1级 2016-10-26 回答 在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.当被操作对象数目不大时,可以直接利用mu ...

  5. python如何次传参给线程_python如何给线程中的函数传参?

    1.Process说明 (1)概念 process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建. (2)语法([group [, target [, name [, args [, k ...

  6. python携程酒店评论_Python基于selenium爬取携程酒店评论信息

    爬取站点 任意一个携程酒店的详细链接,这里给出了四个,准备开四个线程爬取: https://hotels.ctrip.com/hotel/6278770.html#ctm_ref=hod_hp_hot ...

  7. python 协程、进程、线程_Python进程、线程、协程之间的关系

    一.从操作系统角度 操作系统处理任务, 调度单位是 进程 和 线程 . 1.进程: 表示一个程序的执行活动 (打开程序.读写程序数据.关闭程序) 2.线程: 执行某个程序时, 该进程调度的最小执行单位 ...

  8. python 协程、进程、线程_Python 中的进程、线程、协程

    1. 进程 进程是正在运行的程序实例,是内核分配资源的最基本的单元.进程拥有自己独立的堆和栈,独立的地址空间,资源句柄.进程由 OS 调度,调度开销较大,在并发的切换过程效率较低. Python 提供 ...

  9. python线程进程协程面试_Python学习经验之谈:关于协程的理解和其相关面试问题...

    都知道Python非常适合初学者学习来入门编程,昨天有伙伴留言说面试了Python岗位,问及了一个关于协程的问题,想了想还是跟大家出一篇协程相关的文章和在Python面试中可能会问及的相关面试问题.都 ...

最新文章

  1. 一、MySql优化的基础介绍
  2. python pdf处理 图片_在Python中从PDF提取图像而无需重新采样?
  3. VS2008资源问题解决方法
  4. 从重采样到数据合成:如何处理机器学习中的不平衡分类问题?
  5. halcon知识:hough变换检出图像的直线
  6. mysql好玩的代码_mysql的order by与where出现的好玩事
  7. 状态模式 处理订单状态_将状态机模式实现为流处理器
  8. 消息称苹果正开发基于自研ARM芯片的游戏主机
  9. Hadoop基础-配置历史服务器
  10. 中文短文本的实体识别实体链接,第一名解决方案
  11. 【数据预处理】TIMIT语料库WAV文件转换
  12. python爬微博个人信息_新浪微博数据爬取Part 1:用户个人信息
  13. 【Office使用技巧】word内公式相关快捷键
  14. Tony Chen的专栏
  15. git克隆项目带用户名密码
  16. 亲完如何进行下一步_吻过女孩后,下一步怎么办?
  17. 315道面试题【1】
  18. 工业重镇向智慧城市转型的德国样本
  19. 00.Sublime汉化、默认代码块、代码提示教程
  20. 西南工业气体龙头,客户涉及多个行业领域——2022年6月1日申购

热门文章

  1. Unity3D用状态机制作角色控制系统
  2. C++定时器实现定时任务
  3. pandas使用.astype()修改数据类型
  4. 阿联酋金融机构举办加密资产及金融科技论坛
  5. 不懂优雅停机,搞挂了线上服务,咋办?
  6. 数据结构 课程设计报告
  7. 今年面试大厂研发岗,也太太太太太难了吧!!PS:尤其是AI相关的!!
  8. linux系统新硬盘格式化,linux系统如何格式化一块硬盘?
  9. avc水平什么意思_AVC是什么?
  10. 熟悉Elipse开发工具