姿勢一
import threading
#建立鎖物件
lock = threading.lock(
)#獲取鎖
lock.acquire(
)#釋放鎖
lock.release(
)
注釋: acquire() 和 release() 是成對出現的。往往死鎖的出現就是 release 沒有執行
姿勢二
import threading
lock = threading.lock(
)with lock:
#業務**
pass
注釋: with 是可以 自動 獲取鎖 和 釋放鎖的,可以防止我們忘記釋放鎖而造成死鎖的情況發生
鎖的作用
鎖的核心作用就是為了保證資料的一致性,對鎖內的資源(變數)進行鎖定,避免其他執行緒偷偷進行篡改。以達到我們的預期效果。即: 非同步變同步。
import threading
defwork1()
:global n
for i in
range(3
):n +=
1print
('work...'
,n)def
work2()
:global n
for i in
range(3
):n +=
5print
('work2 ...'
,n)n =
0t1 = threading.thread(target=work1)
t2 = threading.thread(target=work2)
t1.start(
)t2.start(
)#輸出結果
work...
1work...
2work...
3work2 ...
8work2 ...
13work2 ...
18
注釋:由於執行緒是核心級別的,它的切換時由cpu說了算,兩線程間的執行順序是完全沒有約束的,輪到誰了就誰上。所以整個結果是無序的。
import threading
defwork1()
:global n , lock
lock.acquire(
)for i in
range(5
):n +=
1print
('work1 ......'
,n) lock.release(
)def
work2()
:global n, lock
with lock:
for i in
range(5
):n +=
5print
('work2******'
,n)n =
0lock = threading.lock(
)t1 = threading.thread(target=work1)
t2 = threading.thread(target=work2)
t1.start(
)t2.start(
)#輸出結果
work1 ...
...1
work1 ...
...2
work1 ...
...3
work1 ...
...4
work1 ...
...5
work2**
****
10work2**
****
15work2**
****
20work2**
****
25work2**
****
30
解析:
防止死鎖產生
死鎖的原因是多種多樣的,但是本質就是對資源不合理的競爭鎖導致的。
死鎖的常見原因
多個執行緒:
前提條件:
執**況:
執行結果:
from threading import thread,lock
x_lock = lock(
)y_lock = lock(
)def
job1()
:for i in
range(5
):with x_lock:
with y_lock:
print
('this is job1'
,'*'*5
)def
job2()
:for i in
range(5
):with x_lock:
with y_lock:
print
('this is job2'
,'*'*10
)t1 = thread(target=job1)
t2 = thread(target=job2)
t1.start(
)t2.start(
)
全域性鎖
我們都知道 多程序是真正的並行執行 , 多執行緒只是交替執行。
python 中導致 執行緒 交替執行的是乙個叫 gil 【global interpreter lock】全域性鎖 的東西
什麼gil?
注,gil 不是python 本身的特性,而是它的解析器之一的cpython的特性。 python 的解析器還有: pypy , psyco , jpython 等。只是我們絕大多數情況下,都是使用的是cpython 這個解析器,所以也就預設了 python 有 gil 這個特性了。
都知道gil 影響效能, 那麼如何避免受到 gil 的影響?
另外, python 的執行緒在i/o 開銷比較大的情況下,優勢還是特別明顯的。
阿寧的Python學習 去重
第一種方法lists 1 2,3 4,2 3,4 print list set lists 第二種辦法 使用字典 沒有保持原來的順序 lists 1 2,3 4,2 3,4 a lists a.fromkeys lists lists lists.keys print list lists 第三種辦...
阿寧的linux學習 Git檔案刪除
這是我學習linux的過程,每天都會更新所學習的知識總結,每個例子都是我自己的親手實踐的,作為新人的我希望各位大佬提出寶貴的意見!在git中,刪除也是乙個修改操作,做個試驗,先新增乙個新檔案aaa.txt到git並且提交 root localhost reposiitory vim aaa.txt ...
阿寧的Python學習 字串內建函式
python 的字串常用內建函式如下 序號方法及描述 1capitalize 將字串的第乙個字元轉換為大寫 2center width,fillchar 返回乙個指定的寬度 width 居中的字串,fillchar 為填充的字元,預設為空格。3count str,beg 0,end len stri...