1. 程式人生 > >Python threading中lock的使用

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
版權宣告:本文為博主原創文章,轉載請附上博文連結!