国产日韩欧美一区二区三区综合,日本黄色免费在线,国产精品麻豆欧美日韩ww,色综合狠狠操

極客小將

您現在的位置是:首頁 » python編程資訊

資訊內容

多線程比單線程快,是真的嗎?

極客小將2021-01-19-
簡介pyrhon視頻教程欄目介紹多線程是否真的比單線程快。事實上,Python多線程另一個很重要的話題叫,GIL(GlobalInterpreterLock,即全局解釋器鎖)。多線程不一定比單線程快在Python中,可以通過多進程、多線程和多協程來實現多任務。難道多線程就一定比單線程快?下面我用一段代碼
www.pxcodes.com pyrhon視頻教程欄目介紹多線程是否真的比單線程快。

4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

事實上,python 多線程另一個很重要的話題叫,GIL(Global Interpreter Lock,即全局解釋器鎖)。4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

多線程不一定比單線程快

在Python中,可以通過多進程、多線程和多協程來實現多任務。難道多線程就一定比單線程快?4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

下面我用一段代碼證明我自己得觀點。4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

''' @Author: Runsen @微信公眾號: Python之王 @博客: https://blog.csdn.net/weixin_44510615 @Date: 2020/6/4 '''import threading, timedef my_counter(): i = 0 for _ in range(100000000): i = i+1 return Truedef main1(): start_time = time.time() for tid in range(2): t = threading.Thread(target=my_counter) t.start() t.join() # 第一次循環的時候join方法引起主線程阻塞,但第二個線程并沒有啟動,所以兩個線程是順序執行的 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() # 兩個線程均已啟動,所以兩個線程是并發的 print("多線程執行total_time: {}".format(time.time() - start_time))if __name__ == "__main__": main1() main2()復制代碼

運行結果4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

單線程順序執行total_time: 17.754502773284912多線程執行total_time: 20.01178550720215復制代碼

我怕你說我亂得出來得結果,我還是截個圖看清楚點4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

這時,我懷疑:我的機器出問題了嗎?其實不是這樣,本質上來說Python 的線程失效了,沒有起到并行計算的作用。4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

Python 的線程,的確封裝了底層的操作系統線程,在 Linux 系統里是 Pthread(全稱為 POSIX Thread),而在 Windows 系統里是 Windows Thread。另外,Python 的線程,也完全受操作系統管理,比如協調何時執行、管理內存資源、管理中斷等等。4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

GIL不是Python的特性

GIL 的概念用簡單的一句話來解釋,就是任一時刻,無論線程多少,單一 CPython 解釋器只能執行一條字節碼。這個定義需要注意的點:4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

首先需要明確的一點是GIL并不是Python的特性,它是在實現Python解析器(CPython)時所引入的一個概念。4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

C++是一套語言(語法)標準,但是可以用不同的編譯器來編譯成可執行代碼。有名的編譯器例如GCC,INTEL C++,Visual C++等。4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

Python也一樣,同樣一段代碼可以通過CPython,PyPy,Psyco等不同的Python執行環境來執行。4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

其他 Python 解釋器不一定有 GIL。例如 Jython (JVM) 和 IronPython (CLR) 沒有 GIL,而 CPython,PyPy 有 GIL;4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

因為CPython是大部分環境下默認的Python執行環境。所以在很多人的概念里CPython就是Python,也就想當然的把GIL歸結為Python語言的缺陷。所以這里要先明確一點:GIL并不是Python的特性,Python完全可以不依賴于GIL4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

GIL本質就是一把互斥鎖

GIL本質就是一把互斥鎖,既然是互斥鎖,所有互斥鎖的本質都一樣,都是將并發運行變成串行,以此來控制同一時間內共享數據只能被一個任務所修改,進而保證數據安全。4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

可以肯定的一點是:保護不同的數據的安全,就應該加不同的鎖。4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

GIL 的工作原理:比如下面這張圖,就是一個 GIL 在 Python 程序的工作示例。其中,Thread 1、2、3 輪流執行,每一個線程在開始執行時,都會鎖住 GIL,以阻止別的線程執行;同樣的,每一個線程執行完一段后,會釋放 GIL,以允許別的線程開始利用資源。4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

計算密集型

計算密集型任務的特點是要進行大量的計算,消耗CPU資源。4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

我們先來看一個簡單的計算密集型示例: 4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

''' @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, 下面我們用兩個線程看看結果又如何:4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

''' @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沒有等待, 而改為多線程后, 增加了線程后, 在線程之間頻繁的切換,增大了時間開銷, 時間當然會增加了。4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

還有一種類型是IO密集型,涉及到網絡、磁盤IO的任務都是IO密集型任務,這類任務的特點是CPU消耗很少,任務的大部分時間都在等待IO操作完成(因為IO的速度遠遠低于CPU和內存的速度)。對于IO密集型任務,任務越多,CPU效率越高,但也有一個限度。常見的大部分任務都是IO密集型任務,比如Web應用。4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

總結:對于io密集型工作(Python爬蟲),多線程可以大幅提高代碼效率。對CPU計算密集型(Python數據分析,機器學習,深度學習),多線程的效率可能比單線程還略低。所以,數據領域沒有多線程提高效率之說,只有將CPU提升到GPU,TPU來提升計算能力。4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

相關免費學習推薦:python視頻教程4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

以上就是多線程比單線程快,是真的嗎?的詳細內容,更多請關注少兒編程網其它相關文章!4Px少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

預約試聽課

已有385人預約都是免費的,你也試試吧...

主站蜘蛛池模板: 久治县| 仙居县| 双柏县| 巴中市| 博湖县| 宜春市| 阳城县| 容城县| 兴隆县| 牙克石市| 松原市| 双鸭山市| 阿尔山市| 水城县| 新野县| 沽源县| 台中市| 额济纳旗| 壤塘县| 阜宁县| 汶川县| 南丹县| 宁安市| 晋宁县| 全南县| 巨野县| 津市市| 大化| 视频| 刚察县| 威海市| 蒲江县| 石台县| 阿瓦提县| 福海县| 三门县| 武隆县| 翁牛特旗| 八宿县| 同江市| 绩溪县|