Python多執行緒與GIL

2021-07-31 16:22:26 字數 1948 閱讀 6632

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...