Python 进程锁使用
生活随笔
收集整理的這篇文章主要介紹了
Python 进程锁使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用原因
多進程搶占資源
當多個進程使用同一份數據資源的時候,就會引發數據安全或順序混亂問題。
示例
# 由并發變成了串行,犧牲了運行效率,但避免了競爭 import os import time import random from multiprocessing import Process,Lockdef 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":2} # 注意一定要用雙引號,不然json無法識別 # 并發運行,效率高,但競爭寫同一文件,數據寫入錯亂from multiprocessing import Process import time,json,randomdef search():dic = json.load(open('db'))print('\033[43m剩余票數%s\033[0m' % dic['count'])def get():dic = json.load(open('db'))time.sleep(0.1) # 模擬讀數據延遲if dic['count'] > 0:dic['count'] -= 1time.sleep(0.2) # 模擬寫數據延遲json.dump(dic,open('db','w'))print('\033[43m購票成功\033[0m')def task():search()get()if __name__ == '__main__':for i in range(10): # 模擬并發10個客戶端搶票p=Process(target=task)p.start()剩余票數2 剩余票數2 剩余票數2 剩余票數2 剩余票數2 剩余票數2 剩余票數2 剩余票數2 剩余票數2 剩余票數2 購票成功 購票成功 購票成功 購票成功 購票成功 購票成功 購票成功 購票成功 購票成功 購票成功加鎖
# 文件db的內容為:{"count":5} # 注意一定要用雙引號,不然json無法識別 # 并發運行,效率高,但競爭寫同一文件,數據寫入錯亂from multiprocessing import Process,Lock import time,json,randomdef search():dic=json.load(open('db'))print('\033[43m剩余票數:%s\033[0m' % dic['count'])def get():dic=json.load(open('db'))time.sleep(random.random()) # 模擬讀數據的網絡延遲if dic['count'] > 0:dic['count'] -= 1time.sleep(random.random()) # 模擬寫數據的網絡延遲json.dump(dic,open('db','w'))print('\033[43m購票成功\033[0m')else:print('\033[43m余票不足\033[0m')def task(lock):search()lock.acquire()get()lock.release()if __name__ == '__main__':lock=Lock()for i in range(10): # 模擬并發10個客戶端p=Process(target=task,args=(lock,))p.start()剩余票數:5 剩余票數:5 剩余票數:5 剩余票數:5 剩余票數:5 剩余票數:5 剩余票數:5 剩余票數:5 剩余票數:5 剩余票數:5 購票成功 購票成功 購票成功 購票成功 購票成功 余票不足 余票不足 余票不足 余票不足 余票不足因為只有5張票,因此加鎖后只會有5個人買到票,保證了數據的安全性。
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的Python 进程锁使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 社会人照片
- 下一篇: python+selenium七:下拉框