阿寧的Python學習 鎖

2021-10-11 19:10:18 字數 3039 閱讀 8754

姿勢一

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...