gil(global interpreter lock)是在實現python解析器(cpython)時所引入的乙個概念。但值得注意的是,gil並不一定是所有python編譯器均必須的,如jpython就沒有gil。
gil是python為解決多執行緒之間資料完整性和狀態同步的辦法,類似於在存在乙個全域性的鎖,但是在現在看來已經成為了乙個python的缺陷。
gil的影響
一般來說,多執行緒的並行執行要比單執行緒的序列執行的速度要快,但是在python中卻不一定。下面給出單執行緒序列**和多執行緒的**,有興趣的讀者可以自己嘗試執行,會發現序列的**執行速度更快,這就是gil給以cpython為解析器的python帶來的缺陷。
單執行緒**:
#! /usr/bin/python
from threading import thread
import time
global count
count = 0
defmy_counter
():global count
i = 0
for _ in range(1000000):
count += 1
i = i + 1
return
true
defmain
(): thread_array = {}
start_time = time.time()
for tid in range(2):
t = thread(target=my_counter)
t.start()
t.join()
end_time = time.time()
print("total time: {}".format(end_time - start_time))
print ("count: ", count)
if __name__ == '__main__':
main()
多執行緒**:
#! /usr/bin/python
from threading import thread
import time
global count
count = 0
defmy_counter
():global count
i = 0
for _ in range(1000000):
i = i + 1
count += 1
return
true
defmain
(): thread_array = {}
start_time = time.time()
for tid in range(2):
t = thread(target=my_counter)
t.start()
thread_array[tid] = t
for i in range(2):
thread_array[i].join()
end_time = time.time()
print("total time: {}".format(end_time - start_time))
print("count:", count)
if __name__ == '__main__':
main()
但是,python的多執行緒執行的結果與多執行緒是類似的,上例中由於全域性變數count並沒有加鎖,因此在多執行緒執行的結果與單執行緒的執行結果不一致,因此我們不能依靠gil來為我們提供了執行緒共享資源的安全訪問。
建議
在python中盡量使用multiprocessing庫替代thread庫,雖然多程序的資源共享沒有多執行緒方便,但是此時執行的效果與您想的一致,不會出現讓你覺得很怪異的問題。
Python 多執行緒 GIL問題
python 多執行緒gil問題 gil全域性直譯器 由於python直譯器自身設計的需求,只能允許乙個執行緒進行工作,無論你開啟多少個執行緒,python在執行任務的時候在同一時刻只能允許乙個執行緒允許。應為gil的問題,多個執行緒同一時刻只能有乙個執行許可權,多個執行緒會爭取這個執行許可權,造成...
Python全域性直譯器鎖GIL與多執行緒
python中如果是 i o密集型的操作,用多執行緒 協程asyncio 執行緒threading 如果i o操作很慢,需要很多任務 執行緒協同操作,用asyncio,如果需要有限數量的任務 執行緒,那麼使用多執行緒。如果是cpu密集型操作,用多程序 multeprocessing 設計者為了規避類...
11 1 多執行緒的GIL
gil global interpreter lock 基於cpython寫的 gil使得python在多核cpu上也只能執行乙個程序 所謂多核多個程序再跑是乙個假象,他是來回切換的,問題 gil 在同乙個程序直到結束才會釋放嗎?total 0 defadd global total for i i...