Python3 多线程为啥比单线程优秀

10人阅读 评论(0) 收藏 举报
分类:

先了解下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锁,接着继续下一个请求,只能是一个个的排队,直到最后一个执行完,显而易见,这里的线程相当并发请求了,比单线程要快的多。

查看评论

多线程为什么比单线程快呢?

多线程为什么比单线程快呢?
  • BigJacky
  • BigJacky
  • 2016-06-05 12:30:03
  • 4322

多线程为什么跑的比单线程还要慢的情况分析及验证

2014-05-04 07:56:50cnblogs.com-Ethan Cai-点击数: 306 “多个人干活比一个人干活要快,多线程并行执行也比单线程要快”这是我学习编程长期以来的想法。...
  • ljj2312
  • ljj2312
  • 2015-03-11 22:42:26
  • 3668

多线程和单线程的执行效率问题

多线程和单线程的执行效率问题 转:平凡之路的博客 一提到多线程一般大家的第一感觉就是可以提升程序性能,在实际的操作中往往遇到性能的问题,都尝试使用多线程来解决问题,但多线程程序并不...
  • SpadgerZ
  • SpadgerZ
  • 2016-10-12 21:46:31
  • 2599

单线程和多线程的优缺点

单线程和多线程的优缺点 多线程处理的优点 同步应用程序的开发比较容易,但由于需要在上一个任务完成后才能开始新的任务,所以其效率通常比多线程应用程序低。如果完成同步任务所用的时间比预...
  • Chengweilin2014
  • Chengweilin2014
  • 2016-10-12 11:44:27
  • 3103

单线程和多线程的优缺点(windows平台)

今晚和一同事在车上闲聊起了关于linux下的多线程和单线程问题,最后总结后得到一个问题:在软实时的linux操作系统下(cpu单核和多核分两种情况说),对消息的处理,是采用多线程程序处理快呢,还是采用...
  • educast
  • educast
  • 2013-10-31 09:21:06
  • 2484

多线程不一定比单线程快

1、TODO
  • mynamepg
  • mynamepg
  • 2018-03-16 13:56:33
  • 21

从单线程到多线程

进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体。而进程则...
  • vbanglev
  • vbanglev
  • 2007-02-07 16:02:00
  • 2053

单线程与多线程的区别

什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。 而一个进程又是由多个线程所组成的。 什么是线程? 线程是程序中的一个执行流,每...
  • u012134199
  • u012134199
  • 2015-05-31 18:19:29
  • 11642

多线程复制文件比单线程慢?

Java多线程拷贝文件测试
  • baidu_25382097
  • baidu_25382097
  • 2017-04-18 00:09:32
  • 411

剖析nginx等单线程服务器设计原理与性能优势

      nginx现在正在以光的速度蔓延开来,他以其稳定性和高性能等众多优点迅速扩大市场,大家都知道,nginx是以单线程为基础的,那么他怎么能在并发性上取得优势的呢?会不会因为网络阻塞而导致主线...
  • dknypxt
  • dknypxt
  • 2010-01-03 13:54:00
  • 1556
    个人资料
    等级:
    访问量: 0
    积分: 12
    排名: 0
    文章存档