Python 多執行緒 GIL問題

2022-07-07 21:48:08 字數 1300 閱讀 6269

python 多執行緒gil問題(gil全域性直譯器):

由於python直譯器自身設計的需求,只能允許乙個執行緒進行工作,無論你開啟多少個執行緒,python在執行任務的時候在同一時刻只能允許乙個執行緒允許。

應為gil的問題,多個執行緒同一時刻只能有乙個執行許可權,多個執行緒會爭取這個執行許可權,造成多個執行緒來回的切換,造成時間的消耗。

io密集型:推薦使用多執行緒, 應為遇見io阻塞時候( time.sleep ),會切換到另外其他執行緒工作;但是會有切換消耗。解決方法(多程序+協程)

from

common.sdpdbutils import sqlserver

import threading,time

def

select

(host,thread_name):

print(

''%(thread_name,time.ctime()))

sql="

select * from histask where convert(datetime,hisdt) between %s and %s

"db =sqlserver(host)

result = db.fetchall_by_params(sql, '

2020-12-01 00:00

', '

2021-01-01 00:00')

db.close()

print(

''%(thread_name, time.ctime()))

if __name__ =='

__main__':

# 採用gil方式的多執行緒執行任務消耗時間為 36秒

t1=threading.thread(target=select,args=(,threading.thread().getname(),))

t2=threading.thread(target=select,args=(,threading.thread().getname(),))

t3=threading.thread(target=select,args=(,threading.thread().getname(),))

t1.start()

t2.start()

t3.start()

# 採用普通呼叫函式的方式執行任務消耗時間為 17秒
# 

select(,'

thread-1')

# select(,'

thread-3')

# select(,'

thread-5

')

Python多執行緒與GIL

gil global interpreter lock 是在實現python解析器 cpython 時所引入的乙個概念。但值得注意的是,gil並不一定是所有python編譯器均必須的,如jpython就沒有gil。gil是python為解決多執行緒之間資料完整性和狀態同步的辦法,類似於在存在乙個全域...

python多執行緒GIL的問題記錄

由於物理上得限制,各cpu廠商在核心頻率上的比賽已經被多核所取代。為了更有效的利用多核處理器的效能,就出現了多執行緒的程式設計方式,而隨之帶來的就是執行緒間資料一致性和狀態同步的困難。即使在cpu內部的cache也不例外,為了有效解決多份快取之間的資料同步時各廠商花費了不少心思,也不可避免的帶來了一...

11 1 多執行緒的GIL

gil global interpreter lock 基於cpython寫的 gil使得python在多核cpu上也只能執行乙個程序 所謂多核多個程序再跑是乙個假象,他是來回切換的,問題 gil 在同乙個程序直到結束才會釋放嗎?total 0 defadd global total for i i...