Python中的互斥鎖

Jarvis_You發表於2018-11-08

程式間記憶體空間是相互獨立的,多個子程式併發,他們在執行程式碼時,是由CPU隨機選取分配,當遇到較長的執行步驟,會引起步驟間的相互影響。 這個時候就需要互斥鎖,它相當於給執行步驟新增了一個標籤,同一時間內,有且僅有一個標籤內的程式可以執行,這樣就可以避免子程式執行關鍵步驟被相互影響的問題。

在multiprocessing模組中可以找到Lock這個功能

先執行一段不加鎖的程式碼

from multiprocessing import Process,Lock
def task1():
    for i in range(10000):
        print("===")

def task2():
    for i in range(10000):
        print("===============")

def task3():
    for i in range(10000):
        print("======================================")

if __name__ == '__main__':
    mutex = Lock()

    p1 = Process(target=task1)
    p2 = Process(target=task2)
    p3 = Process(target=task3)

    p1.start()
    p2.start()
    p3.start()
複製程式碼

擷取了其中一段,其結果很好的說明子程式在執行時會相互搶CPU資源,這種情況如果出現在寫入資料時就會造成資料的異常。

===============
===============

==================

=====================================================
===
======================================

=========================================
=====================================================
======================================
======================================
======================================

===
=====================================================

===
複製程式碼

我們現在給程式加上互斥鎖,需要注意加的必須是同一把互斥鎖,鎖中間寫入的是需要保證完整性的程式

lock.acquire()

lock.release()
複製程式碼
def task1(lock):
    lock.acquire()
    for i in range(10000):
        print("===")
    lock.release()

def task2(lock):
    lock.acquire()
    for i in range(10000):
        print("===============")
    lock.release()

def task3(lock):
    lock.acquire()
    for i in range(10000):
        print("======================================")
    lock.release()

if __name__ == '__main__':

    mutex = Lock()

    p1 = Process(target=task1,args=(mutex,))
    p2 = Process(target=task2,args=(mutex,))
    p3 = Process(target=task3,args=(mutex,))

    p1.start()
    p2.start()
    p3.start()
複製程式碼

子程式的執行結果將是有序的,但是執行順序並不是按照從上到下的順序依次執行,子程式在啟動後的執行先後完全是CPU的隨機執行,不過我們程式的子程式在建立上是有一個非常小的時間差,從而導致了順序執行,如果可以保證子程式在同一時刻建立完成,那麼他們的執行將會是無序的。

相關文章