多线程为啥比较快,双线程比单线程快多少

  多线程为啥比较快,双线程比单线程快多少

  

pyrhon视频教程栏目介绍多线程是否真的比单线程快。

  事实上,Python多线程的另一个重要主题叫做GIL(全局解释器锁)。

  00-1010在Python中,可以通过多进程、多线程、多协程实现多任务。多线程一定比单线程快吗?

  我将用下面的一段代码来证明我的观点。

  @作者:润森

  @微信微信官方账号:Python之王

  @博客:https://blog.csdn.net/weixin_44510615

  @日期:2020年6月4日

   导入线程,timedef my_counter():

  i=0

  for _ in范围(100000000):

  i=i 1

  返回Truedef main1():

  范围(2):中tid的start_time=time.time()

  t=螺纹。线程(target=my_counter)

  启动()

  t . join()# join方法导致主线程在第一个循环中阻塞,但是第二个线程没有启动,所以两个线程是顺序执行的。

  打印( Total _ time 3360 {} )。format(time . time()-start _ time))def main 2():

  thread_ary={}

  范围(2):中tid的start_time=time.time()

  t=螺纹。线程(target=my_counter)

  启动()

  thread_ary[tid]=范围(2):中I的t

  Thread_ary[i]。join() #两个线程都启动了,所以它们是并发的。

  Print(多线程执行total _ time : {} 。format(time . time()-start _ time))if _ _ name _== _ main _ _ 3360

  main1()

  2.main2()复制代码运行结果。

  单线程顺序执行total _ time 3360 17,2773284912多线程执行total _ time 3360 20215复制代码。我怕你会说我糊涂了,所以我还是拍张照看清楚吧。59660.88868688666

  这一刻,我在想:我的机器是不是出问题了?其实并不是这样的。本质上Python的线程是无效的,并没有起到并行计算的作用。

  Python的线程确实封装了底层操作系统线程,Linux系统是Pthread(全称POSIX Thread),Windows系统是Windows Thread。此外,Python线程也完全由操作系统管理,比如协调何时执行、管理内存资源、管理中断等等。

  

多线程不一定比单线程快

任一时刻,无论线程多少,单一 CPython 解释器只能执行一条字节码.用一句简单的话解释了GIL的概念,即在这个定义中指出要注意的:

  首先要明确的是GIL并不是Python的特性,这是在实现Python parser (CPython)时引入的概念。

  c是一套语言(语法)标准,但是可以被不同的编译器编译成可执行代码。GCC、INTEL C、Visual C等知名编译器。

  Python也是如此。同一段代码可以由不同的Python执行环境执行,比如CPython、PyPy、Psyco等。

  其他 Python 解释器不一定有 GIL.比如Jython (JVM)和IronPython (CLR)没有GIL,而CPython和PyPy有Gil

  因为CPython是大多数环境下默认的Python执行环境。所以在很多人的概念里,CPython就是Python,所以很自然的把GIL归结于Python语言的缺陷。所以让我们在这里说清楚:

  ong>GIL并不是Python的特性,Python完全可以不依赖于GIL

  

GIL本质就是一把互斥锁

GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全。

  可以肯定的一点是:保护不同的数据的安全,就应该加不同的锁。

  GIL 的工作原理:比如下面这张图,就是一个 GIL 在 Python 程序的工作示例。其中,Thread 1、2、3 轮流执行,每一个线程在开始执行时,都会锁住 GIL,以阻止别的线程执行;同样的,每一个线程执行完一段后,会释放 GIL,以允许别的线程开始利用资源。

  

计算密集型

计算密集型任务的特点是要进行大量的计算,消耗CPU资源。

  我们先来看一个简单的计算密集型示例:

  

'''

  @Author: Runsen

  @微信公众号: Python之王

  @博客: https://blog.csdn.net/weixin_44510615

  @Date: 2020/6/4

  '''import time

  COUNT = 50_000_000def count_down():

   global COUNT while COUNT > 0:

   COUNT -= 1s = time.perf_counter()

  count_down()

  c = time.perf_counter() - s

  print('time taken in seconds - >:', c)

  time taken in seconds - >: 9.2957003复制代码

这个是单线程, 时间是9s, 下面我们用两个线程看看结果又如何:

  

'''

  @Author: Runsen

  @微信公众号: Python之王

  @博客: https://blog.csdn.net/weixin_44510615

  @Date: 2020/6/4

  '''import timefrom threading import Thread

  COUNT = 50_000_000def count_down():

   global COUNT while COUNT > 0:

   COUNT -= 1s = time.perf_counter()

  t1 = Thread(target=count_down)

  t2 = Thread(target=count_down)

  t1.start()

  t2.start()

  t1.join()

  t2.join()

  c = time.perf_counter() - s

  print('time taken in seconds - >:', c)

  time taken in seconds - >: 17.110625复制代码

我们程序主要的操作就是在计算, CPU没有等待, 而改为多线程后, 增加了线程后, 在线程之间频繁的切换,增大了时间开销, 时间当然会增加了。

  还有一种类型是IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用。

  总结:对于io密集型工作(Python爬虫),多线程可以大幅提高代码效率。对CPU计算密集型(Python数据分析,机器学习,深度学习),多线程的效率可能比单线程还略低。所以,数据领域没有多线程提高效率之说,只有将CPU提升到GPU,TPU来提升计算能力。

  

相关免费学习推荐:python视频教程

  

以上就是多线程比单线程快,是真的吗?的详细内容,更多请关注盛行IT软件开发工作室其它相关文章!

  

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: