成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

多線程真的比單線程快?

開發 后端
事實上,Python 多線程另一個很重要的話題叫,GIL(Global Interpreter Lock,即全局解釋器鎖)。在Python中,可以通過多進程、多線程和多協程來實現多任務。難道多線程就一定比單線程快?

[[351041]]

 事實上,Python 多線程另一個很重要的話題叫,GIL(Global Interpreter Lock,即全局解釋器鎖)。

多線程不一定比單線程快

在Python中,可以通過多進程、多線程和多協程來實現多任務。難道多線程就一定比單線程快?

下面我用一段代碼證明我自己得觀點。

  1. ''
  2. @Author:Runsen 
  3. @微信公眾號:Python之王 
  4. @博客:https://blog.csdn.net/weixin_44510615 
  5. @Date:2020/6/4 
  6. ''
  7.  
  8. import threading, time 
  9. def my_counter(): 
  10.     i = 0 
  11.     for _ in range(100000000): 
  12.         i = i+1 
  13.     return True 
  14.  
  15. def main1(): 
  16.     start_time = time.time() 
  17.     for tid in range(2): 
  18.         t = threading.Thread(target=my_counter) 
  19.         t.start() 
  20.         t.join()  # 第一次循環的時候join方法引起主線程阻塞,但第二個線程并沒有啟動,所以兩個線程是順序執行的 
  21.  
  22.     print("單線程順序執行total_time: {}".format(time.time() - start_time)) 
  23.  
  24. def main2(): 
  25.     thread_ary = {} 
  26.     start_time = time.time() 
  27.     for tid in range(2): 
  28.         t = threading.Thread(target=my_counter) 
  29.         t.start() 
  30.         thread_ary[tid] = t 
  31.  
  32.     for i in range(2): 
  33.         thread_ary[i].join()  # 兩個線程均已啟動,所以兩個線程是并發的 
  34.  
  35.     print("多線程執行total_time: {}".format(time.time() - start_time)) 
  36.  
  37. if __name__ == "__main__"
  38.     main1() 
  39.     main2() 

運行結果

  1. 單線程順序執行total_time: 17.754502773284912 
  2. 多線程執行total_time: 20.01178550720215 

我怕你說我亂得出來得結果,我還是截個圖看清楚點

這時,我懷疑:我的機器出問題了嗎?其實不是這樣,本質上來說Python 的線程失效了,沒有起到并行計算的作用。

Python 的線程,的確封裝了底層的操作系統線程,在 Linux 系統里是 Pthread(全稱為 POSIX Thread),而在 Windows 系統里是 Windows Thread。另外,Python 的線程,也完全受操作系統管理,比如協調何時執行、管理內存資源、管理中斷等等。

GIL不是Python的特性

GIL 的概念用簡單的一句話來解釋,就是「任一時刻,無論線程多少,單一 CPython 解釋器只能執行一條字節碼」。這個定義需要注意的點:

首先需要明確的一點是「GIL并不是Python的特性」,它是在實現Python解析器(CPython)時所引入的一個概念。

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資源 

我們先來看一個簡單的計算密集型示例:

  1. ''
  2. @Author:Runsen 
  3. @微信公眾號:Python之王 
  4. @博客:https://blog.csdn.net/weixin_44510615 
  5. @Date:2020/6/4 
  6. ''
  7. import time 
  8. COUNT = 50_000_000 
  9.  
  10. def count_down(): 
  11.    global COUNT 
  12.    while COUNT > 0: 
  13.        COUNT -= 1 
  14.  
  15. s = time.perf_counter() 
  16. count_down() 
  17. c = time.perf_counter() - s 
  18. print('time taken in seconds - >:', c) 
  19.  
  20. time taken in seconds - >: 9.2957003 

這個是單線程, 時間是9s, 下面我們用兩個線程看看結果又如何:

  1. ''
  2. @Author:Runsen 
  3. @微信公眾號:Python之王 
  4. @博客:https://blog.csdn.net/weixin_44510615 
  5. @Date:2020/6/4 
  6. ''
  7. import time 
  8. from threading import Thread 
  9.  
  10. COUNT = 50_000_000 
  11.  
  12. def count_down(): 
  13.    global COUNT 
  14.    while COUNT > 0: 
  15.        COUNT -= 1 
  16.  
  17. s = time.perf_counter() 
  18. t1 = Thread(target=count_down) 
  19. t2 = Thread(target=count_down) 
  20. t1.start() 
  21. t2.start() 
  22. t1.join() 
  23. t2.join() 
  24. c = time.perf_counter() - s 
  25. print('time taken in seconds - >:', c) 
  26.  
  27. 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之王
相關推薦

2021-06-11 11:28:22

多線程fork單線程

2024-09-27 11:51:33

Redis多線程單線程

2009-07-10 09:05:20

SwingWorker

2019-06-17 14:20:51

Redis數據庫Java

2023-10-15 12:23:10

單線程Redis

2023-08-17 14:12:17

2021-01-28 11:17:49

Python爬蟲單線程

2023-12-01 08:18:24

Redis網絡

2019-10-29 20:13:43

Java技術程序員

2020-09-23 13:37:25

Redis6.0

2025-06-17 00:22:00

2020-11-17 10:20:53

Redis多線程單線程

2023-03-21 08:02:36

Redis6.0IO多線程

2010-08-30 08:55:56

JavaScript引

2022-01-04 11:11:32

Redis單線程Reactor

2018-01-11 08:24:45

服務器模型詳解

2023-02-07 08:18:34

單線程Redis內存

2019-02-18 08:10:53

2010-01-28 16:45:44

Android單線程模

2025-04-24 08:15:00

Redis單線程線程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级片免费视频 | 欧美国产精品一区二区三区 | 久草在线 | 国内精品久久久久久 | 久久精品视频在线观看 | 最新国产福利在线 | 久久中文一区二区 | 一级黄在线观看 | 国产一区二区三区四区hd | 不卡在线视频 | 国产精品久久久久一区二区三区 | 精品国产99 | 日韩2020狼一二三 | 欧美11一13sex性hd | 在线视频一区二区三区 | 电影午夜精品一区二区三区 | 国产精品美女在线观看 | 欧美精品一区二区免费 | 黄色片亚洲| 日本高清视频在线播放 | 欧美精品v| 亚洲 精品 综合 精品 自拍 | www.婷婷| 国产成人精品在线播放 | 久久国产精品视频 | 亚洲综合在 | 亚洲午夜视频在线观看 | www.久久.com | 亚洲视频一区在线观看 | 99欧美精品 | 午夜视频导航 | 久久久亚洲一区 | 九九福利 | 免费h在线 | 午夜免费福利影院 | 久久久久国产成人精品亚洲午夜 | 亚洲精品中文在线观看 | 91超碰在线 | 日日操视频 | 欧美一区二区 | 亚洲精品免费看 |