python的多线程与单线程的效率问题
先了解下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的多线程与单线程的效率问题相关推荐
- python是多线程还是单线程_Python单线程与多线程
最近一直在学习爬虫的相关知识,目前学习到了单线程.多线程这一块,把自己的学习经历分享出来顺便也做个笔记. 一.单线程操作 单线程操作就是我们日常写代码时的操作,为了比较出和多线程的区别,以下为其对比. ...
- 多线程和单线程执行效率比较
单线程的也就是程序执行时,所跑的程序路径(处理的东西)是连续顺序下来的,必须前面的处理好,后面的彩绘执行到. 多线程嘛,举个例子也就是说程序可以同时执行2个以上相同类似的操作,比如一些搜索代理或者群 ...
- python和c运行速度的对比实验_Python中单线程、多线程和多进程的效率对比实验...
原标题:Python中单线程.多线程和多进程的效率对比实验 文 | 饒木陽 Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下 ...
- Python中单线程、多线程与多进程的效率对比实验
Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下,不能发挥多核的优势.而使用多进程(Multiprocess),则可以发挥多 ...
- python io密集型应用案例-Python中单线程、多线程和多进程的效率对比实验实例
python的多进程性能要明显优于多线程,因为cpython的GIL对性能做了约束. Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread ...
- Python|并发编程|爬虫|单线程|多线程|异步I/O|360图片|Selenium及JavaScript|Scrapy框架|BOM 和 DOM 操作简介|语言基础50课:学习(12)
文章目录 系列目录 原项目地址 第37课:并发编程在爬虫中的应用 单线程版本 多线程版本 异步I/O版本 总结 第38课:抓取网页动态内容 Selenium 介绍 使用Selenium 加载页面 查找 ...
- Python 多线程比单线程慢?
看到一个说多线程比单线程慢的帖子,我惊呆了 赶紧测试了一下 说多线程比单线程慢那兄弟就是喝高了! 单线程和多线程分别进行 10*100万次运算 得出结果,多线程速度远超单线程 至于为什么 绝大多帖都说 ...
- Python之多线程
Python的对线程为什么被说成是鸡肋? 1.1GIL是什么?(Global Interpreter Lock)Python设计之初,为了数据的安全所做的决定. 1.2Python 多线程下,每个线程 ...
- 关于python的多线程和多进程_Python的多线程和多进程
(1)多线程的产生并不是因为发明了多核CPU甚至现在有多个CPU+多核的硬件,也不是因为多线程CPU运行效率比单线程高.单从CPU的运行效率上考虑,单任务进程及单线程效率是最高的,因为CPU没有任何进 ...
最新文章
- python post与get的区别_python中get和post有什么区别
- HDU 1166 敌兵布阵【树状数组】
- 自定义变量 配置文件_跟我一起学.NetCore之自定义配置源热更新对象绑定
- 语义分析的一些方法(中篇)
- python储存与读取图片_Python下opencv使用笔记(一)(图像简单读取、显示与储存)...
- vs联合torch,ZED相机api,opencv建立C++项目
- 荒岛余生为什么没有打开包裹_您会带到荒岛什么办公桌设置?
- html仿苹果浏览器,完美仿iPhone风格主题 领航浏览器体验
- mysql给数据量大的表添加索引的办法
- 虚拟机服务器断网,Vmware虚拟机断网不能上网的解决方法教程[多图]
- html5在线拍照,HTML5整合本地摄像头,实现视屏预览及拍照上传
- 单目标跟踪算法:SiamRPN++
- 设置页面包含子页面iframe用法
- VC2010 MFC程序制作Flash动画欢迎界面
- c语言一个整数犯二的程度编程,2016天梯初赛上篇(部分题目)
- 一些EXCHANGE命令
- 硕士阶段学习情况汇总
- c语言编程中的或逻辑的符号 符号如何输入,C语言中逻辑运算符(,||,!)和位运算符号(,|,^)...
- 持久记录精彩时刻,汉印CP4000体验
- document 和 window.document
热门文章
- hyperledger fabric 1 chaincode 教程1
- linux双系统uefi引导修复,桌面应用|Windows和Ubuntu双系统,修复UEFI引导的两种办法...
- 华为app测试软件,测评:华为最新移动应用/APP测试工具MobileTest
- xib引用自定义xib(oc)
- Java复习第11天---11.4---Java8新特性---Stream流常用方法3和综合案例
- 读书笔记——读《不断进步的电容器-片状陶瓷电容篇》
- vuepress(五)部署到github.io
- 仿网易新闻客户端(二)
- 判别函数(七)势函数法
- 前端数据模拟的几种方法