死鎖: 死鎖就是一直等待對方釋放鎖的情景
死鎖的結果會造成程式的停止響應, 不能再處理其他的任務了
需求: 根據下標在列表中取值, 保證同一時刻只能有乙個執行緒去取值
import threading
import time
#建立互斥鎖
lock = threading.lock(
)# 根據下標去取值, 保證同一時刻只有乙個執行緒去取值
defget_value
(index)
:# 上鎖
lock.acquire(
)print
(threading.current_thread())
my_list =[3
,6,8
,1]# 判斷下標釋放越界
if index >=
len(my_list)
:print
("下標越界"
, index)
return
value = my_list[index]
print
("value"
, value)
time.sleep(
0.2)
# 釋放鎖
lock.release(
)if __name__ ==
"__main__"
:# 模擬大量執行緒去執行操作
for i in
range(30
):sub_thread = threading.thread(target=get_value, args=
(i,)
) sub_thread.start(
)# 控制台輸出
1, started 10400
)>
value 3
2, started 568
)>
value 6
3, started 6360
)>
value 8
4, started 13328
)>
value 1
5, started 3012
)>
下標越界 4
# 此刻程式還未結束
避免死鎖就要在合適的地方釋放鎖
import threading
import time
# 建立互斥鎖
lock = threading.lock(
)# 根據下標去取值, 保證在同一時刻只能有乙個執行緒取值
defget_value
(index):
lock.acquire(
)print
(threading.surrrent_thred())
my_list =[3
,6,8
,1]if index >=
len(my_list)
:print
("下標越界"
, index)
# 當下標越界需要釋放釋放鎖, 讓後邊的執行緒還可以取值
lock.release(
)return
value = my_list[index]
print
(value)
time.sleep(
0.2)
lock.release(
)if __name__ ==
"__main__"
:# 模擬大量執行緒去執行取值操作
for i in
range(30
):sub_thread = threading.thread(target=get_value, args=
(i,)
) sub_thread.start(
)# 控制台輸出 《沒有產生死鎖》
1, started 14704
)>
32, started 11788
)>
63, started 1220
)>
84, started 15180
)>
15, started 11204
)>
下標越界 4
6, started 12608
)>..
.29, started 9496
)>
下標越界 28
30, started 12456
)>
下標越界 29
個人見解,僅供參考import threading
import time
# 建立互斥鎖
lock = threading.lock(
)# 根據下標去取值, 保證同一時刻只能有乙個執行緒去取值
defget_value
(index)
:# with 自己上鎖, 並自己釋放鎖
with lock:
print
(threading.current_thread())
my_list =[3
,6,8
,1]if index >=
len(my_list)
:print
("下標越界"
, index)
return
value = my_list[index]
print
(value)
time.sleep(
0.2)
if __name__ ==
"__main__"
:# 模擬大量執行緒去執行取值操作
for i in
range(30
):sub_thread = threading.thread(target=get_value, args=
(i,)
) sub_thread.start(
)
使用互斥鎖的時候需要注意死鎖的問題, 要在合適的地方注意釋放鎖
死鎖一旦產生就會造成應用程式的停止響應, 應用程式無法再繼續往下執行了
with 可以避免上邊的問題, 個人見解
python 執行緒死鎖示例
銀行轉賬 兩個賬戶同時給對方轉賬,模擬線程死鎖 from threading import thread,lock from time import sleep 賬戶類 class account def init self,id,balance,lock 每個賬戶自帶乙個鎖,只要數字balance...
mysql 死鎖模擬 mysql死鎖示例
mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也支援表級鎖...
mysql死鎖示例
mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也支援表級鎖...