先了解下CPU的简单运行原理:

  它运行速度非常快,1s内可以运行成千上万次,一个核心可以把1s切分成成千上万个时间片段,这个核心确实同时只能运行一个任务;但是可以将多个任务交替执行,比如上一个时间片段内运行A任务,下个时间片段可以运行B任务,交替执行,因为时间片段很短,所以感觉就是同时在进行了。

  再了解下单线程和多线程的区别:

  先看下单进程,顾名思义,就是一条进程,类似于单向公路上只有一条车道,每次只能过一辆车,多进程则表示多个车道,可以同时过多辆车;那么单线程和多线程意义严格上来说不是进程这样的理解,因为进程内的线程同一时间点只能运行一个,不存在同时进行,CPU给我们的感觉的同时进行,只是它运行的非常快,交替执行多个线程差别可能是毫秒、微秒的区别,所以感觉不到差别,他们在同时进行。

  接着就产生了单线程和多线程的疑惑:

  既然上述说了,多线程并不是多个线程并发在同一时间点运行,而是CPU有计划的交替执行各个多线程,那多线程的优势在哪里?比如python里,从上运行到下调用多次同一个函数是个单线程,和把几次调用函数写成多线程,依据上述理论,这里的CPU运行时间并没有变快啊,因为多线程不能并发运行,也是一个个线程类交替执行完成啊,甚至多线程可能更慢,因为它还要花时间去管理交替执行任务上,不要怀疑,事实上就是如此,那么我们使用多线程的意义在哪里?

  这里需要了解下GIL:

  Python是解释型语言,那么它在运行的时候就需要解释器了,简单描述下GIL,即global interpreter lock,全局解释器锁,就是python在运行的时候会锁定解释器,就是说在运行的时候只能是一个线程,锁死了,切换不了;每个线程在运行之前都要申请GIL,那么就必须要等上一个线程释放这把锁你才可以申请到,然后执行代码,执行完后,你再交给下一个线程,让它去执行代码,过程如下:

  设置GIL -> 切换到一个线程去执行 -> 运行 -> 把线程设置为睡眠状态 -> 解锁GIL

  然后再次重复以上步骤。

  IO密集型任务多线程比单线程要快太多:

  貌似多线程比单线程还要耗CPU,而且运行速度又没变快,甚至更慢,这是相对于计算密集型任务(要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力)来说的,像这类计算密集型任务由于主要消耗CPU资源,python用多线程效率不会提高,甚至是会更慢,原理见上述GIL;

  还有一种IO密集型任务,涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度),99%的时间都花在IO上,花在CPU上的时间很少;

  原谅我不自觉的想到了爬虫,爬虫是典型的IO密集型任务,多线程的发送请求情况下:发送一个请求到收到服务器的响应数据取决于网络的快慢,那么发送一个请求之后就是等待服务器的响应了,期间会释放GIL锁,其他线程就可以申请到这把锁,进行发送请求了,重复上述操作直到最后一个请求,那么就等同于非常短的时间内,CPU发送了多个请求,接下来就是等待服务器的响应;那么如果是单线程呢?它发送一个请求后就在那里等着服务器响应,直到服务器有返回数据到客户端后,才会释放GIL锁,接着继续下一个请求,只能是一个个的排队,直到最后一个执行完,显而易见,这里的线程相当并发请求了,比单线程要快的多。

  综上所述:

  在处理计算密集型任务时,python的多线程劣与单线程,性能表现比单线程要差;

  在处理IO密集型任务时,python的多线程优与单线程,性能表现比单线程要好太多;

转自:https://www.cnblogs.com/znyyy/p/7999299.html

最新文章

  1. MariaDB学习
  2. JVM-绘图展现字节码执行引擎执行过程
  3. 每日学习总结<一> 2015-8-31
  4. SQL JOINS
  5. Floyd算法 及其运用
  6. Font-Awesome 体验 鼠标进入图标变大
  7. JavaScript学习笔记(一)——数据类型和变量
  8. 基于python机器学习人脸自动补全
  9. 高性能缓存系统Memcached在ASP.NET MVC中应用
  10. bzoj2006 [NOI2010]超级钢琴 (及其拓展)
  11. 石子合并 区间dp模板
  12. 普通windows版本安装winServer的特色功能 以dedup功能为展示点
  13. String类型的学习
  14. Struts2的拦截器是如何使用AOP工作的
  15. eclipse 创建一个java项目 运行
  16. Sping实战之通过JAVA代码装配Bean
  17. 最近的一些零碎知识点,jquery遍历
  18. python之函数(一)
  19. 类加载(一):static块 和 Class.forName
  20. JSTree下的模糊查询算法——树结构数据层次遍历和递归分治地深入应用

热门文章

  1. 浅谈正则表达式-PHP为例
  2. 计蒜客 28206.Runway Planning (BAPC 2014 Preliminary ACM-ICPC Asia Training League 暑假第一阶段第一场 F)
  3. Python的网络编程[3] -> BOOTP 协议[0] -> BOOTP 的基本理论
  4. 洛谷——P1579 哥德巴赫猜想(升级版)
  5. Count and Say (Array Length Encoding) -- LeetCode
  6. [xsy2724]Tree
  7. [USACO09MAR]Cleaning Up
  8. 1.13(java学习笔记)异常机制
  9. SQL 增删改查 复习
  10. jdbc多种实现方式