国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python多線程對多核cpu的利用解析

89542767 / 1013人閱讀

  小編寫這篇文章的一個主要目的,主要是來給大家去做一個詳細解答,解答的內容是對python多線程的一個相關理解,包括其對多核cpu利用的一個詳細解析,具體的內容,請各位讀者仔細的進行閱讀下文。


  引言


  我們經常聽到"因為GIL的存在,python的多線程不能利用多核CPU",現在我們暫且不提GIL,python能不能利用多核cpu,今天我做了一個實驗,代碼很簡單如下所示


  while 1:
  pass


  沒有運行這段代碼前cpu狀態

01.png

  運行之后的狀態


  下面兩張圖是運行之后的狀態,當然這只是兩張比較有代表性的圖,截圖間隔有十幾秒的樣子

02.png

  根據第一張圖我們發現cpu1、cpu3的負載有明顯增長,我們可以得出python線程是可以利用多核cpu的結論,之前一直以為python運行后會綁定cpu其中的一個核心現在看來并不是這個樣子。第二張圖就比較有意思了cpu2滿載了,這又是為什么呢?


  想來想去應該是linux中cpu對進程的親和性導致的,這種親和性是軟性的并不是強制的,這也就解釋了為什么第一張圖中是多cpu在負載。


  ok為了更直觀的看出python線程能夠利用多核cpu,我們改下代碼,換一種方式再來看下


  import os
  while 1:
  print os.getpid()#輸出進程號


  運行代碼結果

03.png

  一目了然,線程的確在不同的核心上切換。


  現在我們回過頭看下那句經典的話"因為GIL的存在,python的多線程不能利用多核CPU",這句話很容易讓人理解成GIL會讓python在一個核心上運行,有了今天的例子我們再來重新理解這句話,GIL的存在讓python在同一時刻只能有一個線程在運行,這毋庸置疑,但是它并沒有給線程鎖死或者說指定只能在某個cpu上運行,另外我需要說明一點的是GIL是與進程對應的,每個進程都有一個GIL。


  python線程的執行流程理解


  線程——>搶GIL——>CPU


  這種執行流程導致了CPU密集型的多線程程序雖然能夠利用多核cpu時跟單核cpu是差不多的,并且由于多個線程搶GIL這個環節導致運行效率<=單線程。


  看到這可能會讓人產生一種錯覺,有了GIL后python是線程安全的,好像根本不需要線程鎖,而實際情況是線程拿到CPU資源后并不是一直執行的,python解釋器在執行了該線程100條字節碼(注意是字節碼不是代碼)時會釋放掉該線程的GIL,如果這時候沒有加鎖那么其他線程就可能修改該線程用到的資源;


  遇到IO也會釋放GIL


  另外一個問題是遇到IO也會釋放GIL,下面是這兩種情況的例子


  import threading
  a=[]
  def m1():
  for _ in range(100000):
  a.append(1)
  def m2():
  for _ in range(100000):
  a.append(2)
  def check():
  """
  檢查a是否有序
  """
  for i in range(len(a)):
  if i!=0:
  if a<i><a[i-1]:
  print a[i-1],a<i>
  return False
  return True
  t1=threading.Thread(target=m1)
  t2=threading.Thread(target=m2)
  t1.start()
  t2.start()
  t1.join()
  t2.join()
  print check()
  預期1111...22222...,截圖顯示跟預期的不同
  import threading
  text1='1'*10000
  text2='2'*10000
  def write(text):
  with open('test.txt','a')as f:
  f.write(text)
  def m1():
  write(text1)
  def m2():
  write(text2)
  t1=threading.Thread(target=m1)
  t2=threading.Thread(target=m2)
  t1.start()
  t2.start()
  t1.join()
  t2.join()


  test.txt截圖

04.png

  最后結論是,因為GIL的存在,python的多線程雖然可以利用多核CPU,但并不能讓多個核同時工作。


  綜上所述,上述內容就給大家介紹完畢,希望可以給大家帶來幫助。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/128442.html

相關文章

  • Python解析器CpythonGIL解釋器鎖工作機制

      小編寫這篇文章的一個主要目的,主要是來給大家做個解答,解答的內容主要是涉及到的內容有Python解析器的一些相關介紹,介紹的內容主要是Cpython的GIL解釋器解鎖相關機制的一些介紹。具體的內容,下面就給大家詳細解答下。  本節重點  掌握Cpython的GIL解釋器鎖的工作機制  掌握GIL與互斥鎖  掌握Cpython下多線程與多進程各自的應用場景  本節時長需控制在45分鐘內  一引子...

    89542767 評論0 收藏0
  • python大佬養成計劃----進程、線程進程

    摘要:在一個進程內部,要同時干多件事,就需要同時運行多個子任務,我們把進程內的這些子任務稱為線程。總結一下,多任務的實現方式有三種多進程模式多線程模式多進程多線程模式線程是最小的執行單元,而進程由至少一個線程組成。 進程與線程 很多同學都聽說過,現代操作系統比如Mac OS X,UNIX,Linux,Windows等,都是支持多任務的操作系統。 什么叫多任務呢?簡單地說,就是操作系統可以同時...

    taowen 評論0 收藏0
  • python 和 ruby

    摘要:的解析器實現更成熟,第三方庫質量高解析器盡管已經有了很大的性能提升和很多新的功能,但是從源代碼實現的角度來說,基本上是通過在源代碼上打來增加功能的。相對而言,解析器更成熟,也比較穩定。 最近在考慮學習一門后端語言,在ruby和python直接猶豫,然后自己做了一些對比,希望能幫到有同樣問題的你。 一、異同對比選擇1、Python和ruby的相同點: 都強調語法簡單,都具有更一般的表達...

    ghnor 評論0 收藏0
  • Python Process/Thread 概念整理

    摘要:每個在同一時間只能執行一個線程在單核下的多線程其實都只是并發,不是并行,并發和并行從宏觀上來講都是同時處理多路請求的概念。在多線程下,每個線程的執行方式獲取執行代碼直到或者是虛擬機將其掛起。拿不到通行證的線程,就不允許進入執行。 進程與線程 并發與并行 進程與線程   首先要理解的是,我們的軟件都是運行在操作系統之上,操作系統再控制硬件,比如 處理器、內存、IO設備等。操作系統為了向上...

    Youngs 評論0 收藏0
  • Python中單線程線程進程效率比實驗

    摘要:中單線程多線程與多進程的效率對比實驗多線程多進程中多線程和多進程的對比是運行在解釋器中的語言,查找資料知道,中有一個全局鎖,在使用多進程的情況下,不能發揮多核的優勢。 title: Python中單線程、多線程與多進程的效率對比實驗date: 2016-09-30 07:05:47tags: [多線程,多進程,Python]categories: [Python] meta: Pyt...

    niceforbear 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<