先了解下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的多线程优与单线程,性能表现比单线程要好太多;

python的多线程与单线程的效率问题相关推荐

  1. python是多线程还是单线程_Python单线程与多线程

    最近一直在学习爬虫的相关知识,目前学习到了单线程.多线程这一块,把自己的学习经历分享出来顺便也做个笔记. 一.单线程操作 单线程操作就是我们日常写代码时的操作,为了比较出和多线程的区别,以下为其对比. ...

  2. 多线程和单线程执行效率比较

    单线程的也就是程序执行时,所跑的程序路径(处理的东西)是连续顺序下来的,必须前面的处理好,后面的彩绘执行到.  多线程嘛,举个例子也就是说程序可以同时执行2个以上相同类似的操作,比如一些搜索代理或者群 ...

  3. python和c运行速度的对比实验_Python中单线程、多线程和多进程的效率对比实验...

    原标题:Python中单线程.多线程和多进程的效率对比实验 文 | 饒木陽 Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下 ...

  4. Python中单线程、多线程与多进程的效率对比实验

    Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下,不能发挥多核的优势.而使用多进程(Multiprocess),则可以发挥多 ...

  5. python io密集型应用案例-Python中单线程、多线程和多进程的效率对比实验实例

    python的多进程性能要明显优于多线程,因为cpython的GIL对性能做了约束. Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread ...

  6. Python|并发编程|爬虫|单线程|多线程|异步I/O|360图片|Selenium及JavaScript|Scrapy框架|BOM 和 DOM 操作简介|语言基础50课:学习(12)

    文章目录 系列目录 原项目地址 第37课:并发编程在爬虫中的应用 单线程版本 多线程版本 异步I/O版本 总结 第38课:抓取网页动态内容 Selenium 介绍 使用Selenium 加载页面 查找 ...

  7. Python 多线程比单线程慢?

    看到一个说多线程比单线程慢的帖子,我惊呆了 赶紧测试了一下 说多线程比单线程慢那兄弟就是喝高了! 单线程和多线程分别进行 10*100万次运算 得出结果,多线程速度远超单线程 至于为什么 绝大多帖都说 ...

  8. Python之多线程

    Python的对线程为什么被说成是鸡肋? 1.1GIL是什么?(Global Interpreter Lock)Python设计之初,为了数据的安全所做的决定. 1.2Python 多线程下,每个线程 ...

  9. 关于python的多线程和多进程_Python的多线程和多进程

    (1)多线程的产生并不是因为发明了多核CPU甚至现在有多个CPU+多核的硬件,也不是因为多线程CPU运行效率比单线程高.单从CPU的运行效率上考虑,单任务进程及单线程效率是最高的,因为CPU没有任何进 ...

最新文章

  1. python post与get的区别_python中get和post有什么区别
  2. HDU 1166 敌兵布阵【树状数组】
  3. 自定义变量 配置文件_跟我一起学.NetCore之自定义配置源热更新对象绑定
  4. 语义分析的一些方法(中篇)
  5. python储存与读取图片_Python下opencv使用笔记(一)(图像简单读取、显示与储存)...
  6. vs联合torch,ZED相机api,opencv建立C++项目
  7. 荒岛余生为什么没有打开包裹_您会带到荒岛什么办公桌设置?
  8. html仿苹果浏览器,完美仿iPhone风格主题 领航浏览器体验
  9. mysql给数据量大的表添加索引的办法
  10. 虚拟机服务器断网,Vmware虚拟机断网不能上网的解决方法教程[多图]
  11. html5在线拍照,HTML5整合本地摄像头,实现视屏预览及拍照上传
  12. 单目标跟踪算法:SiamRPN++
  13. 设置页面包含子页面iframe用法
  14. VC2010 MFC程序制作Flash动画欢迎界面
  15. c语言一个整数犯二的程度编程,2016天梯初赛上篇(部分题目)
  16. 一些EXCHANGE命令
  17. 硕士阶段学习情况汇总
  18. c语言编程中的或逻辑的符号 符号如何输入,C语言中逻辑运算符(,||,!)和位运算符号(,|,^)...
  19. 持久记录精彩时刻,汉印CP4000体验
  20. document 和 window.document

热门文章

  1. hyperledger fabric 1 chaincode 教程1
  2. linux双系统uefi引导修复,桌面应用|Windows和Ubuntu双系统,修复UEFI引导的两种办法...
  3. 华为app测试软件,测评:华为最新移动应用/APP测试工具MobileTest
  4. xib引用自定义xib(oc)
  5. Java复习第11天---11.4---Java8新特性---Stream流常用方法3和综合案例
  6. 读书笔记——读《不断进步的电容器-片状陶瓷电容篇》
  7. vuepress(五)部署到github.io
  8. 仿网易新闻客户端(二)
  9. 判别函数(七)势函数法
  10. 前端数据模拟的几种方法