queue類是執行緒安全的,適用於多執行緒間安全的交換資料。內部使用了lock和condition。
queue類的size雖然加了鎖,但是,依然不能保證立即get、put就能成功,因為讀取大小和get、put方法是分開的。
import queue
q = queue.queue(8)
if q.qsize()==
7:q.put(
)# 上下兩句可能被打斷
if q.qsize()==
1:q.get(
)# 未必會成功
cpython在直譯器程序級別有一把鎖,叫做gil,即全域性直譯器鎖。
gil保證cpython程序中,只有乙個執行緒執行位元組碼。甚至是在多核cpu的情況下,也只允許同時只能有乙個cpu上執行該程序的乙個執行緒。
cpython中io密集型,某個執行緒阻塞,就會排程其他就緒執行緒;
cpu密集型,當前執行緒可能會連續的獲得gil,導致其他執行緒幾乎無法使用cpu。
在cpython中由於有gil存在,io密集型,使用多執行緒較為合算;cpu密集型,使用多程序,要繞開gil。
import logging
import datetime
format =
'%(thread)s --> %(message)s'
logging.basicconfig(level=logging.info,
format
=format)
start = datetime.datetime.now(
)def
calc()
:sum=0
for _ in
range
(1000000):
sum+=
1
calc(
)calc(
)calc(
)calc(
)delta =
(datetime.datetime.now(
)- start)
.total_seconds(
)logging.info(delta)
15460 --> 0.260867
import logging
import datetime
import threading
format =
'%(thread)s --> %(message)s'
logging.basicconfig(level=logging.info,
format
=format)
start = datetime.datetime.now(
)def
calc()
:sum=0
for _ in
range
(1000000):
sum+=
1
t1 = threading.thread(target=calc)
t2 = threading.thread(target=calc)
t3 = threading.thread(target=calc)
t4 = threading.thread(target=calc)
t1.start(
)t2.start(
)t3.start(
)t4.start(
)t1.join(
)t2.join(
)t3.join(
)t4.join(
)delta =
(datetime.datetime.now(
)- start)
.total_seconds(
)logging.info(delta)
15460 --> 0.263845
GIL 全域性直譯器鎖
1 描述python中gil的概念,以及它對python多執行緒的影響?編寫乙個多執行緒抓取網頁的程式,並闡明多執行緒抓取程式是否可比單執行緒效能有提公升,並解釋原因。答 gil global interpreter lock,即全域性直譯器鎖 1 python語言和gil沒有半毛錢關係。僅僅是由於...
GIL全域性直譯器鎖
gil 啥?他是如何產生的?gil產生的背景 在cpython解釋內部執行多個執行緒的時候,每個執行緒都需要直譯器內部申請相應的全域性資源,由於c語言本身比較底層造成cpython在管理所有全域性資源的時候並不能應對所有執行緒同時的資源請求,因此為了防止資源競爭而發生錯誤,對所有執行緒申請全域性資源...
全域性直譯器鎖GIL
我們使用高併發,一次是建立1萬個執行緒去修改乙個數並列印結果看現象 from threading import thread import osdef func args global n n args print n,os.getpid n 100t list for i in range 100...