python3 進程鎖
- 2020 年 1 月 13 日
- 筆記
多進程搶佔資源 當多個進程使用同一份數據資源的時候,就會引發數據安全或順序混亂問題。
import os import time import random from multiprocessing import Process,Lock def work(n): print('%s: %s is runing' % (n,os.getpid())) time.sleep(random.random()) print('%s: %s is down' % (n, os.getpid())) if __name__ == '__main__': for i in range(3): # 利用for循環模擬多進程 p=Process(target=work,args=(i,)) p.start() 輸出結果: 0: 10974 is runing 1: 10975 is runing 2: 10976 is runing 1: 10975 is down 2: 10976 is down 0: 10974 is down
加鎖
# 由並發變成了串列,犧牲了運行效率,但避免了競爭 import os import time import random from multiprocessing import Process,Lock def work(lock,n): lock.acquire() print('%s: %s is runing' % (n,os.getpid())) time.sleep(random.random()) print('%s: %s is down' % (n, os.getpid())) lock.release() if __name__ == '__main__': lock = Lock() for i in range(3): p=Process(target=work,args=(lock,i)) p.start() 輸出結果: 0: 10986 is runing 0: 10986 is down 1: 10987 is runing 1: 10987 is down 2: 10988 is runing 2: 10988 is down
上面這種情況雖然使用加鎖的形式實現了順序的執行,但是程式又重新變成串列了,這樣確實會浪費了時間,卻保證了數據的安全。這個過程類似於資料庫的事務
例子:模擬搶票
沒有加鎖的情況,雖然實現了並發,但是數據不安全,本來只有一張票,但是還是會有多個人搶到,這顯然不符合現實
# 文件db的內容為:{"count":1} # 注意一定要用雙引號,不然json無法識別 # 並發運行,效率高,但競爭寫同一文件,數據寫入錯亂 from multiprocessing import Process import time,json,random def search(): dic = json.load(open('db')) print('