python 一文讀懂 GIL

2021-09-10 13:34:00 字數 908 閱讀 5611

1. python 的直譯器分為 cpython(預設直譯器)和 jpython,由於歷史原因,在 cpython 上難以移除 gil

2. 每個執行緒執行是都需要先獲取 gil,保證同一時刻只有乙個執行緒可以執行**,所以 python 的多執行緒並不是真正的多執行緒,不能利用多核的 cpu 資源,但多程序可以利用多核的 cpu 資源。

3. 執行緒釋放 gil:在 io 操作等可能會引起阻塞的 system call 之前,可以暫時釋放 gil,但在執行完畢之後,必須重新獲取 gil

4. 多執行緒並不是雞肋,存在即合理。例如爬蟲時多執行緒比單執行緒效能有所提公升,因為遇到 io 阻塞會自動釋放 gil

5. 避免 gil:在 python 中可以將核心模組通過 c/c++ 實現,通過 python 來呼叫 c/c++,從而能繞開 gil,讓程式能夠高效執行。

使用 c 語言來解決 gil 問題

把乙個c語言檔案編譯成乙個動態庫的命令(linux平台下):

gcc ***.c -shared -o lib***x.so

用乙個 c 語言實現子執行緒死迴圈:

void deadloop()

}

python 實現主線程死迴圈:

from ctypes import *

from threading import thread

#載入動態庫

lib = cdll.loadlibrary("./libloop.so")

#建立乙個子執行緒,讓其執行c語言編寫的函式,此函式是乙個死迴圈

t = thread(target=lib.deadloop)

t.start()

#主線程

while true:

pass

一文讀懂Nginx

問 nginx的負載均衡演算法有什麼?預設是什麼演算法?答 1 輪詢 按請求的時間輪詢查空閒的後端伺服器 2 指定輪詢機率 機率的原因是後端伺服器的效能不均勻,好的多分點,差的少分點 3 固定ip繫結固定伺服器 預設是加權輪詢,就是優先訪問權重高的伺服器 問 nginx是單執行緒的嗎?答 是單執行緒...

一文讀懂SpringMVC

主要講的是dispatcherservlet這個類 ioc其實是乙個map,工程啟動後掃瞄路徑,根據類的全限定名建立bean 問 怎麼根據路徑找到方法?map還存key為 aaa value為該controller例項 問 autowired原理?自定義註解,在載入的時候,掃瞄controller層...

堆疊 一文讀懂

堆疊 stack 是一種先進後出的 操作受限的線性表,也可以直接稱為棧。可以把棧想象成乙個桶一樣,往這個桶裡面一層一層的放東西,先放進去的在裡面,後放進去的東西依次在外面。但取東西的時候就是先取靠近外面的,再依次一層層取裡面的。這就是 後進先出 last in first out 的原則。因此 棧 ...