本章節主要介紹了進程互斥鎖如何控制,而互斥鎖的意思就是互相排斥,若是把多個進程比喻爲多我的, 互斥鎖的工做原理就是多我的都要去爭搶同一個資源,下面咱們一塊兒來看看吧!json
進程同步(multiprocess.Lock)安全
鎖 —— multiprocess.Lock網絡
進程之間數據不共享,可是共享同一套文件系統,因此訪問同一個文件,或同一個打印終端,是沒有問題的,併發
而共享帶來的是競爭,競爭帶來的結果就是錯亂,如何控制,就是加鎖處理dom
多進程模擬搶票實例ide
#文件db的內容爲:{"count":1}#注意必定要用雙引號,否則json沒法識別from multiprocessing import Process,Lockimport time,json,randomdefsearch(): dic=json.load(open('db'))ui
print('\033[43m剩餘票數%s\033[0m' %dic['count'])defget(): dic=json.load(open('db')) time.sleep(0.1) #模擬讀數據的網絡延遲 if dic['count'] >0: dic['count']-=1 time.sleep(0.2) #模擬寫數據的網絡延遲 json.dump(dic,open('db','w')) print('\033[43m購票成功\033[0m')deftask(): search() get()if __name__ == '__main__': for i in range(100): #模擬併發100個客戶端搶票 p=Process(target=task) p.start()# 引起問題:數據寫入錯亂
互斥鎖保證數據安全code
from multiprocessing import Process,Lockimport time,json,randomdefsearch(): dic=json.load(open('db'))隊列
print('\033[43m剩餘票數%s\033[0m' %dic['count'])defget(): dic=json.load(open('db')) time.sleep(random.random()) # 模擬讀數據的網絡延遲 if dic['count'] >0: dic['count']-=1 time.sleep(random.random()) # 模擬寫數據的網絡延遲 json.dump(dic,open('db','w')) print('\033[32m購票成功\033[0m') else: print('\033[31m購票失敗\033[0m')deftask(lock): search() lock.acquire() # 將買票這一環節由併發變成了串行,犧牲了運行效率可是保證了數據的安全 get() lock.release()if __name__ == '__main__': lock = Lock() for i in range(100): # 模擬併發100個客戶端搶票 p=Process(target=task,args=(lock,)) p.start()
總結:加鎖能夠保證多個進程修改同一塊數據時,同一時間只能有一個任務能夠進行修改,即串行的修改,沒錯,速度是慢了,但犧牲了速度卻保證了數據安全。進程
問題:雖然能夠用文件共享數據顯示進程間數據通訊但問題是
效率低(共享數據基於文件,而文件是硬盤上的數據)
須要本身加鎖處理
針對上述問題,咱們須要找到一種更加合理快捷的方式,那就是隊列和管道,下一小節介紹