程式間記憶體空間是相互獨立的,多個子程式併發,他們在執行程式碼時,是由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的隨機執行,不過我們程式的子程式在建立上是有一個非常小的時間差,從而導致了順序執行,如果可以保證子程式在同一時刻建立完成,那麼他們的執行將會是無序的。