python入門教程12-07 (python語法入門之進程互斥鎖)

本章節主要介紹了進程互斥鎖如何控制,而互斥鎖的意思就是互相排斥,若是把多個進程比喻爲多我的, 互斥鎖的工做原理就是多我的都要去爭搶同一個資源,下面咱們一塊兒來看看吧!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()

總結:加鎖能夠保證多個進程修改同一塊數據時,同一時間只能有一個任務能夠進行修改,即串行的修改,沒錯,速度是慢了,但犧牲了速度卻保證了數據安全。進程

問題:雖然能夠用文件共享數據顯示進程間數據通訊但問題是

效率低(共享數據基於文件,而文件是硬盤上的數據)

須要本身加鎖處理

針對上述問題,咱們須要找到一種更加合理快捷的方式,那就是隊列和管道,下一小節介紹

相關文章
相關標籤/搜索