1. 程式人生 > >python多執行緒探討 基於原始碼 初步分析

python多執行緒探討 基於原始碼 初步分析

這篇文章 應該有人需要 因為我現在都需要 所以標了個關鍵字初步

摘自百度百科

儘管提高CPU的時鐘頻率和增加快取容量後的確可以改善效能,但這樣的CPU效能提高在技術上存在較大的難度。實際上在應用中基於很多原因,CPU的執行單元都沒有被充分使用。如果CPU不能正常讀取資料(匯流排/記憶體的瓶頸),其執行單元利用率會明顯下降。另外就是大

超執行緒晶片 超執行緒晶片

多數執行執行緒缺乏ILP(Instruction-Level Parallelism,指令級別並行)支援。這些都造成了CPU的效能沒有得到全部的發揮。因此,Intel則採用另一個思路去提高CPU的效能,讓CPU可以同時執行多重執行緒,就能夠讓CPU發揮更大效率,即所謂“超執行緒(

Hyper-Threading,簡稱“HT”)”技術。超執行緒技術就是利用特殊的硬體指令,把一個物理核心模擬成兩個邏輯核心,讓單個處理器都能使用執行緒級平行計算,進而相容多執行緒作業系統和軟體,減少了CPU的閒置時間,提高了CPU的執行速度。

這就是多執行緒被廣泛用到的硬體技術之一了吧

這篇文章我不討論GIL 有人說談到python多執行緒繞不過GIL 我試著強行繞過一下 也不是我不知道基本瞭解還是瞭解的

說到python多執行緒 不要太悲觀 因為你從直譯器語言裡面很難找到在多執行緒方面比python做的更好的

沒必要和其他直譯器語言比  也就說說 java吧

執行緒的實現主要有3種方式:使用核心執行緒實現、使用使用者執行緒實現和使用使用者執行緒加輕量級程序混合實現。

這是python的文章 關於java的我就直接轉載了

下面這段話是我從裡面摘抄的

對於Sun JDK來說,它的Windows版與Linux版都是使用一對一的執行緒模型實現的,一條Java執行緒就對映到一條輕量級程序之中,因為Windows和Linux系統提供的執行緒模型就是一對一的。

上面 這就是多執行緒的主旨  對映

程式一般不會直接去使用核心執行緒,而是去使用核心執行緒的一種高階介面——輕量級程序(LWP),即平時所說的執行緒;

cpu 現在不都是強調幾核幾線程嗎 這裡面的執行緒就代表同時能夠進行的併發 執行緒數  如果你是計算型程式 如果你開了超過

cpu規定的執行緒數還能提高速度 我只能說你的運算器開掛了 麻煩通知我 我也想開掛

一點

程式語言的多執行緒是為了迎合作業系統的多執行緒從而提高系統的計算效率.但是具體分配任務到各個核心中去執行的並非JAVA與JVM而是作業系統.也就是說,你所執行的多執行緒,可能會被分配到同一個CPU核心中執行.也可能非配到不同的cpu中執行.如果可以控制CPU的分配,那也應該是作業系統的api才能實現的了------------改了一點

剛剛那個連結裡說了 java執行緒最終由作業系統核心通過操縱排程器對執行緒進行排程,並負責將執行緒的任務對映到各個處理器上。

上面 這就是多執行緒的主旨 對映

連結裡說

因為這個問題是交給了底層的作業系統來解決的,Python借用了底層作業系統所提供的執行緒排程機制來決定下一個獲得GIL進入直譯器的執行緒是誰。

這是可以正實的 作業系統的執行緒排程已經非常成熟了 python社群的大佬們普遍認為沒必要另外做一個執行緒排程機制 基本上所有語言的核心開發者都是這樣認為的

畢竟強如python社群 都認為不需要

 這一點至關重要,這就意味著Python中的執行緒實際上就是作業系統所支援的原生執行緒,並不是模擬出來的。Python中的多執行緒機制也是建立在作業系統的原生執行緒的基礎之上,對應不同的作業系統,有不同的實現,然而最終,在不同的原生執行緒基礎上,Python提供了一套統一的抽象機制,給Python的使用者一個非常簡單而方便的多執行緒工具箱,這就是python中的兩個Module:thread以及在其之上的threading。

python的多執行緒是可以對映到 多處理器的 但是 關鍵在於你永遠也不知道作業系統等下將要排程哪個執行緒  這是非常恐怖的

因為每個執行緒都是可以對映一個處理器的 沒有有gil的時候 想象一下 一個8執行緒的cpu python多執行緒也開八個 形象點說 那就是八隻老虎同時盯著一個共享變數  天知道會發生什麼

有gil之後

換到多核的時候,同時會有多個執行緒在不同的CPU核心上執行,此時不同執行緒之間就需要競爭GIL,而GIL只能同時被一個執行緒申請到,所以會導致其它執行緒處於閒置狀態【即使它已經擁有了CPU資源】。所以Python在多核CPU上的多執行緒始終只有單執行緒在跑程式。

gil是個好東西 就目前而言 聽說pypy已經去掉gil了 先對pypy保持樂觀 畢竟不能與c愉快的混合程式設計 那是撿了芝麻丟了西瓜

多執行緒是很恐怖的 只不過封裝的像一隻小綿羊一樣.

其實多執行緒和多程序本質上是一樣的 都是為了利用cpu的多核心 現在 即便是強如java 都開始倡導多程序程式設計了 多程序切換麻煩但是基本不需要考慮變數共享衝突

儘量使用多程序程式設計 python多執行緒底層是由作業系統排程的 你可以放心大膽的對io等阻塞場景使用 不需要你考慮排程的問題

你僅僅需要考慮變數共享衝等問題

.