多线程为啥比较快,双线程比单线程快多少
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资源。我们先来看一个简单的计算密集型示例:
'''这个是单线程, 时间是9s, 下面我们用两个线程看看结果又如何:@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复制代码
'''我们程序主要的操作就是在计算, CPU没有等待, 而改为多线程后, 增加了线程后, 在线程之间频繁的切换,增大了时间开销, 时间当然会增加了。@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复制代码
还有一种类型是IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用。
总结:对于io密集型工作(Python爬虫),多线程可以大幅提高代码效率。对CPU计算密集型(Python数据分析,机器学习,深度学习),多线程的效率可能比单线程还略低。所以,数据领域没有多线程提高效率之说,只有将CPU提升到GPU,TPU来提升计算能力。
相关免费学习推荐:python视频教程以上就是多线程比单线程快,是真的吗?的详细内容,更多请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。