Cpython的全域性直譯器鎖(GIL)

2022-06-22 22:48:13 字數 1315 閱讀 7481

#

cpyrhon直譯器下有個全域性直譯器鎖-gil:在同一

#在同一時刻,多執行緒中只有乙個執行緒訪問cpu

#有了全域性直譯器鎖(gil)後,在同一時刻只能有乙個執行緒訪問cpu。

#全域性直譯器鎖鎖的是執行緒,而不是資料。

#這種全域性直譯器鎖的特性就是同一時間只有有乙個執行緒訪問cpu,所以在多個cpu的情況下,也只有乙個執行緒在乙個時間點訪問cpu,這是cpython直譯器的特性,這是乙個不好的特性

#到目前為止並沒有乙個直譯器語言可以充分使用多個cpu,乙個時間點只能一者訪問cpu

#在多執行緒環境中,python虛擬機器按一下方式執行訪問cpu:

#設定gil

#切換到乙個執行緒去執行

#執行指定數量的位元組碼指令或執行緒後主動讓出控制(可以呼叫time.sleep())

#把執行緒設定為睡眠狀態

#解決gil

#再次重複以上所有操作

#高cpu: 在高cpu利用率的**中,此時這種同一時刻只能有乙個執行緒訪問cpu機制會響應效率,如高計算類的**中。如真遇到這種情況,可以用多程序,不用多執行緒處理

#高io:處理檔案、處理web請求、爬取網頁、裝置檔案、讀寫資料、send、recv,我們遇到的基本都是io的,很少遇到計算類的東西

#比較多執行緒與多程序的效率。多執行緒的執行效率會好些,在高io的情況、和簡單的計算類情況下

import

time

from threading import

thread

from multiprocessing import

process

deffunc(n):

n + 1

if__name__ == '

__main__':

start =time.time()

t_lst =

for i in range(100):

t = thread(target=func, args=(i, ))

t.start()

for t in

t_lst:

t.join()

t1 = time.time() -start

start2 =time.time()

p_lst =

for i in range(100):

p = process(target=func, args=(i, ))

p.start()

for p in

p_lst:

p.join()

t2 = time.time() -start2

print(t1, t2)

python GIL全域性直譯器鎖

什麼是gil python 的執行由python 虛擬機器 也叫直譯器主迴圈,cpython版本 來控制,python 在設計之初就考慮到要在直譯器的主迴圈中,同時只有乙個執行緒在執行,即在任意時刻,只有乙個執行緒在直譯器中執行。對python 虛擬機器的訪問由全域性直譯器鎖 gil 來控制,正是這...

全域性直譯器鎖(GIL)Cpython

本文介紹cpython中的全域性直譯器鎖 global interpreter lock 只有在cpython中才有奧,jpython中沒有這一機制 python中的執行緒是作業系統的原生執行緒,python虛擬機器使用乙個全域性直譯器鎖 global interpreter lock 來互斥執行緒...

python GIL 全域性直譯器鎖

在vmware虛擬軟體中將ubuntu設定為單核cpu 主線程死迴圈,佔滿cpu while true pass在vmware虛擬軟體中將ubuntu設定為雙核cpu import threading 子執行緒死迴圈 deftest while true pass t1 threading.thre...