实际上,Python 多线程另一个很重要的话题讨论叫 ,GIL
(Global Interpreter Lock
,即全局性解释器锁)。
多线程不一定比单线程快
在Python中,能够根据多进程、多线程和多协程来完成多个任务 。难道说多线程就一定比单线程快?
下边我就用一段编码证实自己得见解。
'''
@Author: Runsen
@微信公众平台: Python之王
@blog: https://blog.csdn.net/weixin_44510615
@Date: 2020/6/4
'''
import threading, time
def my_counter():
i = 0
for _ in range(100000000):
i = i 1
return True
def main1():
start_time = time.time()
for tid in range(2):
t = threading.Thread(target=my_counter)
t.start()
t.join() # 第一次循环系统的情况下join方式造成主线程堵塞 ,但第二个线程并沒有起动,因此 2个线程是次序执行的
print("单线程次序执行total_time: {}".format(time.time() - start_time))
def main2():
thread_ary = {}
start_time = time.time()
for tid in range(2):
t = threading.Thread(target=my_counter)
t.start()
thread_ary[tid] = t
for i in range(2):
thread_ary[i].join() # 2个线程均已起动,因此 2个线程是高并发的
print("多线程执行total_time: {}".format(time.time() - start_time))
if __name__ == "__main__":
main1()
main2()
复制代码
运作結果
单线程次序执行total_time: 17.754502773284912
多线程执行total_time: 20.01178550720215
复制代码
我害怕你说我乱得出去得結果 ,我还是截个图看清点
这时候,我怀疑:我的设备出难题了没有?实际上不是这样,实质上而言Python 的线程无效了 ,沒有具有并行处理的功效。
Python 的线程,确实封裝了最底层的电脑操作系统线程,在 Linux 系统软件里是 Pthread
(全称之为 POSIX Thread
) ,而在 Windows 系统软件里是 Windows Thread
。此外 ,Python 的线程,也彻底受电脑操作系统管理方法,例如融洽什么时候执行 、管理方法运行内存資源、管理方法终断这些。
GIL并不是Python的特性
GIL 的定义用简易的一句话来表述 ,便是任一時刻,不管线程是多少,单一 CPython 解释器只有执行一条字节码。这一界定必须留意的点:
最先必须确立的一点是GIL并并不是Python的特性 ,它是在完成Python在线解析(CPython)时需导入的一个定义 。
C 是一套語言(英语的语法)规范,可是可以用不一样的c语言编译器来编写出可执行编码。知名的c语言编译器比如GCC,INTEL C ,Visual C 等。
Python也一样,一样一段编码能够根据CPython,PyPy ,Psyco等不一样的Python执行自然环境来执行 。
别的 Python 解释器不一定有 GIL。比如 Jython (JVM) 和 IronPython (CLR) 沒有 GIL,而 CPython,PyPy 有 GIL;
由于CPython是绝大多数自然环境下默认设置的Python执行自然环境。因此 在很多人的定义里CPython便是Python ,也就主观臆断的把GIL归纳为Python語言的缺点 。因此 这儿要先确立一点:GIL并并不是Python的特性 ,Python彻底能够不依赖于GIL
GIL实质便是一把互斥锁
GIL实质便是一把互斥锁,即然是互斥锁,全部互斥锁的实质都一样 ,全是将高并发运作变为串行通信,为此来操纵同一时间内共享资源数据信息只有被一个每日任务所改动,从而确保网络信息安全 。
能够毫无疑问的一点是:维护不一样的数据信息的安全性 ,就应当加不一样的锁。
GIL 的原理:例如下边这幅图,便是一个 GIL 在 Python 程序流程的工作中实例。在其中,Thread 1、2 、3 轮着执行 ,每一个线程在刚开始执行时,都是会锁定 GIL,以阻拦其他线程执行;一样的 ,每一个线程执行完一段后,会释放出来 GIL,以容许其他线程刚开始运用資源 。
测算密集式
测算密集式每日任务的特性是要开展很多的测算 ,耗费CPU資源。
大家先看来一个简易的测算密集式实例:
'''
@Author: Runsen
@微信公众平台: Python之王
@blog: https://blog.csdn.net/weixin_44510615
@Date: 2020/6/4
'''
import time
COUNT = 50_000_000
def count_down():
global COUNT
while COUNT > 0:
COUNT -= 1
s = time.perf_counter()
count_down()
c = time.perf_counter() - s
print('time taken in seconds - >:', c)
time taken in seconds - >: 9.2957003
复制代码
这个是单线程 , 时间9s, 下边大家用2个线程看一下結果又怎样:
'''
@Author: Runsen
@微信公众平台: Python之王
@blog: https://blog.csdn.net/weixin_44510615
@Date: 2020/6/4
'''
import time
from threading import Thread
COUNT = 50_000_000
def count_down():
global COUNT
while COUNT > 0:
COUNT -= 1
s = 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来提高数学计算。
创作者:刘润森
连接:https://juejin.im/post/6892747972933910535
来源于:开拓者
版权归创作者全部 。商业服务转截请联络创作者得到 受权 ,非商用转截请标明出處。 文章来源于网络,如有侵权请联系站长QQ61910465删除本文版权归趣快排营销www.seoguRubloG.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系✚Qq61910465