由兩個或兩個以上的程序或執行緒,因搶奪資源而造成的一種互相等待的現象。如果沒有外力,它們將一直等待
例如:from threading import thread, lock
import time
mutexa = lock(
)mutexb = lock(
)class
mythead
(thread)
:def
run(self)
: self.func1(
) self.func2(
)def
func1
(self)
: mutexa.acquire(
)print
('%s 搶到a鎖'
% self.name)
# 獲取當前執行緒名
mutexb.acquire(
)print
('%s 搶到b鎖'
% self.name)
mutexb.release(
) mutexa.release(
)def
func2
(self)
: mutexb.acquire(
)print
('%s 搶到b鎖'
% self.name)
time.sleep(2)
mutexa.acquire(
)print
('%s 搶到a鎖'
% self.name)
# 獲取當前執行緒名
mutexa.release(
) mutexb.release(
)if __name__ ==
'__main__'
:for i in
range(10
):t = mythead(
) t.start(
)結果為:
thread-
1 搶到a鎖
thread-
1 搶到b鎖
thread-
1 搶到b鎖
thread-
2 搶到a鎖
如需解決死鎖問題那麼應該使用遞迴鎖:
rlock內部維護著乙個lock和乙個counter變數,counter記錄了acquire的次數,從而使得資源可以被多次require。直到乙個執行緒所有的acquire都被release,其他的執行緒才能獲得資源。上面的例子如果使用rlock代替lock, 則不會發生死鎖:
更改方式:
from threading import rlock
mutexa = mutexb = rlock(
)
semaphore管理乙個內建的計數器,每當呼叫acquire(
)時內建計數器-
1,呼叫release(
)時內建計數器+
1,計數器不能小於0,當計數器為0時,acquire(
)將阻塞執行緒,直到其他執行緒呼叫release(
)from threading import thread, semaphore
import time
import random
sm = semaphore(5)
# 括號內寫數字 寫幾就表示開設幾個坑位
deftask
(name)
: sm.acquire(
)print
('%s 正在蹲坑'
% name)
time.sleep(random.randint(1,
5)) sm.release(
)if __name__ ==
'__main__'
:for i in
range(20
):t = thread(target=task, args=
('傘兵%s號'
%i,)
) t.start(
)
可以為執行緒提供乙個識別符號,當識別符號為真時才會執行
event.isset(
) 返回event的狀態值
event.wait(
) 如果event.isset()==
false那麼執行緒將會阻塞
event.
set(
)設定event的值為true
event.clear(
)設定event的值為false
from threading import thread, event
import time
event = event(
)# 造了乙個紅綠燈
deflight()
:print
('紅燈亮著的'
) time.sleep(3)
print
('綠燈亮了'
)# 告訴等待紅燈的人可以走了
event.
set(
)def
car(name)
:print
('%s 車正在燈紅燈'
%name)
event.wait(
)# 等待別人給你發訊號
print
('%s 車加油門飆車走了'
%name)
if __name__ ==
'__main__'
: t = thread(target=light)
t.start(
)for i in
range(20
):t = thread(target=car, args=
('%s'
%i,)
) t.start(
)
在佇列中我們可以放入值,也可以讓入元組。
當其值為元組時,那麼它取出的順序為值越小越先取出
import queue
# 我們現在使用的佇列都是只能在本地測試使用
# 1 佇列q 先進先出
# q = queue.queue(3)
# q.put(1)
# q.get()
# q.get_nowait()
# q.get(timeout=3)
# q.full()
# q.empty()
# 後進先出q
# q = queue.lifoqueue(3) # last in first out
# q.put(1)
# q.put(2)
# q.put(3)
# print(q.get()) # 3
# 優先順序q 你可以給放入佇列中的資料設定進出的優先順序
q = queue.priorityqueue(4)
q.put((10
,'111'))
q.put(
(100
,'222'))
q.put((0
,'333'))
q.put((-
5,'444'))
print
(q.get())
# (-5, '444')
# put括號內放乙個元祖 第乙個放數字表示優先順序
# 需要注意的是 數字越小優先順序越高!!!
gevent模組是在單cpu的情況下實現併發
from gevent import monkey;monkey.patch_all(
)import time
from gevent import spawn
"""gevent模組本身無法檢測常見的一些io操作
在使用的時候需要你額外的匯入一句話
from gevent import monkey
monkey.patch_all()
又由於上面的兩句話在使用gevent模組的時候是肯定要匯入的
所以還支援簡寫
from gevent import monkey;monkey.patch_all()
"""def
heng()
:print
('哼'
) time.sleep(2)
print
('哼'
)defha(
):print
('哈'
) time.sleep(3)
print
('哈'
)def
heiheihei()
:print
('heiheihei'
) time.sleep(5)
print
('heiheihei'
)start_time = time.time(
)g1 = spawn(heng)
g2 = spawn(ha)
g3 = spawn(heiheihei)
g1.join(
)g2.join(
)# 等待被檢測的任務執行完畢 再往後繼續執行
g3.join(
)# heng()
# ha()
# print(time.time() - start_time) # 5.005702018737793
print
(time.time(
)- start_time)
# 3.004199981689453 5.005439043045044
Android你需要了解的知識點
1 android四大元件 2 動畫 滑動衝突 自定義view 事件分發機制 4 android的資料儲存方式 5 ui布局 fragment的使用 6 記憶體 效能優化 的處理 螢幕適配 7 網路通訊的幾種實現 斷點續傳的實現 了解tcp ip udp http等網路協議 8 資料結構和演算法 9...
必須了解的一些IT知識點
有些知識感覺明白卻說不明白,博主把它定義為似懂非懂 趁著假期,趕緊掃盲!矽 半導體 矽谷 區域網 廣域網 網際網路 域域網 門戶 防火牆 頻寬 摩爾定律 安迪比爾定律 反摩爾定律,風險投資 天使投資 時間戳。矽 是一種化學元素,符號是si,有無定形矽和晶體矽兩種同素異形體,在地殼中,是第二豐富的元素...
學HTML需要先了解的知識點
1 html中不支援 空格 回車 製表符,它們都會被解析成乙個空白字元。2 utf 8 和 utf8 有什麼區別。utf 8 是標準寫法,php 在 windows 下邊英文不區分大小寫,所以也可以寫成 utf 8 utf 8 也可以把中間的 省略,寫成 utf8 一般程式都能識別,但也有例外 如下...