Python threading中lock的使用
版權宣告: https://blog.csdn.net/u012067766/article/details/79733801
在多執行緒中使用lock可以讓多個執行緒在共享資源的時候不會“亂”,例如,建立多個執行緒,每個執行緒都往空列表l中新增一個數字並列印當前的列表l,如果不加鎖,就可能會這樣:
# encoding=utf8
import threading
import time
lock = threading.Lock()
l = []
def test1(n):
lock.acquire()
l.append(n)
print l
lock.release()
def test(n):
l.append(n)
print l
def main():
for i in xrange(0, 10):
th = threading.Thread(target=test, args=(i, ))
th.start()
if __name__ == '__main__':
main()
執行結果:
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3][
0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4[, 05, , 16, , 27, ]3
, 4, 5, 6[, 07, , 18, ]2
, 3, 4, [50, , 61, , 72, , 83, , 94],
5, 6, 7, 8, 9]
因為每個執行緒都在同時往l中新增一個數字(當前每個執行緒執行的是test函式),然後又可能在同時列印l,所以最後的結果看起來會有些“混亂”。
下面讓每個執行緒呼叫“test1”函式,看看結果如何:
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
現在看起來就好多了,因為test1中每次像l中新增數字並列印之前,都先加了一把“鎖”,這樣就可以保證每次只有一個執行緒可以往l中新增數字,而不是同時往l裡新增數字。
通過上面的結果比較可以知道,當多執行緒中需要“獨佔資源”的時候,要使用鎖來控制,防止多個執行緒同時佔用資源而出現其他異常。
使用鎖的時候就呼叫acquire()方法,以此告訴其他執行緒,我正在佔用該資源,你們要等會;待使用資源後需要釋放資源的時候就呼叫release()方法,告訴其他執行緒,我已經完成使用該資源了,其他人可以過來使用了。
---------------------
作者:鍋爐房劉大爺
來源:CSDN
原文:https://blog.csdn.net/u012067766/article/details/79733801
版權宣告:本文為博主原創文章,轉載請附上博文連結!