Python 3 并发编程多进程之进程同步(锁)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Python 3 并发编程多进程之进程同步(锁)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                Python 3 并發編程多進程之進程同步(鎖)
進程之間數據不共享,但是共享同一套文件系統,所以訪問同一個文件,或同一個打印終端,是沒有問題的,競爭帶來的結果就是錯亂,如何控制,就是加鎖處理。
1、多個進程共享同一打印終端
from multiprocessing import Process import os,time def work():print('%s is running' %os.getpid())time.sleep(2)print('%s is done' %os.getpid())if __name__ == '__main__':for i in range(3):p=Process(target=work)p.start() 并發運行,效率高,但競爭同一打印終端,帶來了打印錯亂 from multiprocessing import Process,Lock import os,time def work(lock):lock.acquire()print('%s is running' %os.getpid())time.sleep(2)print('%s is done' %os.getpid())lock.release() if __name__ == '__main__':lock=Lock()for i in range(3):p=Process(target=work,args=(lock,))p.start() 由并發變成了串行,犧牲了運行效率,但避免了競爭2、多個進程共享同一文件
文件當數據庫,模擬搶票
#文件db的內容為:{"count":1} #注意一定要用雙引號,不然json無法識別 from multiprocessing import Process,Lock import time,json,random def search():dic=json.load(open('db.txt'))print('\033[43m剩余票數%s\033[0m' %dic['count'])def get():dic=json.load(open('db.txt'))time.sleep(0.1) #模擬讀數據的網絡延遲if dic['count'] >0:dic['count']-=1time.sleep(0.2) #模擬寫數據的網絡延遲json.dump(dic,open('db.txt','w'))print('\033[43m購票成功\033[0m')def task(lock):search()get() if __name__ == '__main__':lock=Lock()for i in range(100): #模擬并發100個客戶端搶票p=Process(target=task,args=(lock,))p.start() 并發運行,效率高,但競爭寫同一文件,數據寫入錯亂 #文件db的內容為:{"count":1} #注意一定要用雙引號,不然json無法識別 from multiprocessing import Process,Lock import time,json,random def search():dic=json.load(open('db.txt'))print('\033[43m剩余票數%s\033[0m' %dic['count'])def get():dic=json.load(open('db.txt'))time.sleep(0.1) #模擬讀數據的網絡延遲if dic['count'] >0:dic['count']-=1time.sleep(0.2) #模擬寫數據的網絡延遲json.dump(dic,open('db.txt','w'))print('\033[43m購票成功\033[0m')def task(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() 加鎖:購票行為由并發變成了串行,犧牲了運行效率,但保證了數據安全加鎖可以保證多個進程修改同一塊數據時,同一時間只能有一個任務可以進行修改,即串行的修改,沒錯,速度是慢了,但犧牲了速度卻保證了數據安全。
雖然可以用文件共享數據實現進程間通信,但問題是:
1.效率低
2.需要自己加鎖處理
?為此mutiprocessing模塊為我們提供了基于消息的IPC通信機制:隊列和管道。
1 隊列和管道都是將數據存放于內存中
2 隊列又是基于(管道+鎖)實現的,可以讓我們從復雜的鎖問題中解脫出來,
我們應該盡量避免使用共享數據,盡可能使用消息傳遞和隊列,避免處理復雜的同步和鎖問題,而且在進程數目增多時,往往可以獲得更好的可獲展性。
轉載于:https://www.cnblogs.com/qiangyuge/p/7460916.html
總結
以上是生活随笔為你收集整理的Python 3 并发编程多进程之进程同步(锁)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 紫书 习题8-14 UVa 1616(二
- 下一篇: javascript 获取DropDow
