進程同步工具有前後順序 就是同步進程之間 就是一部但願本來一部的多進程操做,維持一個順序鎖lock = Lock() ## 創造了一把鎖lock.acquire() ##獲取了這把鎖的鑰匙lock.release() ## 歸還這把鎖的鑰匙當幾我的進一間屋子,若是第一我的獲取了鎖的鑰匙,那他進去後會帶着鑰匙進去 而後反鎖,後面的人進不去只有他把鎖還了之後 下一我的才能夠拿鎖進去當多個進程共享一段數據的時候,數據會出現不安全的現象,這就須要枷鎖來維護數據的安全性拿搶票的例子來講:import jsonimport timefrom multiprocessing import Lockfrom multiprocessing import Processdef search(i): with open('dp','r') as f: count_dic = json.load(f) time.sleep(0.2) print('person %s 餘票 : %s張'%(i,count_dic['count']))def buy(i): with open('dp','r') as f: count_dic = json.load(f) time.sleep(0.2) if count_dic['count'] >0: count_dic['count'] -=1 print('person %s 購票成功' %i) time.sleep(0.2) with open('dp','w') as f: json.dump(count_dic,f)def task(i,lock): search(i) lock.acquire() ##若是以前已經被acquire了 且 沒有被release name進程會在這裏阻塞 buy(i) lock.release()if __name__ =='__main__': lock = Lock() for i in range(10): p = Process(target=task,args=(i,lock)) p.start()信號量from multiprocessing import Semaphore ##信號量信號量的本質 多把鑰匙對應一把鎖 lock+count計數拿ktv舉個例子,有10我的 可是隻有4個小房子 這樣子怎麼辦呢?import timeimport randomfrom multiprocessing import Process,Semaphoredef ktv(i,sem): sem.acquire() print('person %s 進入了ktv' %i) time.sleep(random.randint(1,4)) print('person %s 走出了ktv' %i ) sem.release()if __name__ == '__main__': sem = Semaphore(4) for i in range(10): p = Process(target=ktv,args=(i,sem)) p.start()#事件from multiprocessing import Event,Process# wait() 方法 等待# 阻塞 若是這個標誌是False 那麼就阻塞# 非阻塞 若是這個標誌是True 那麼就非阻塞# 查看標誌 is_set()# 修改標誌 set() 將標誌設置爲True# clear() 將標誌設置爲Falsee = Event()print(e.is_set()) ##在事件的建立之初, 默認是Falsee.set() ##將標誌設置爲Trueprint(e.is_set())e.wait() ## 至關於什麼都沒作 passe.clear() ##將標誌設置爲Falsee.wait() ##永遠阻塞e.wait(timeout = 10) ##若是信號在阻塞10s以內變爲True,那麼不繼續阻塞直接pass ##若是就阻塞10s以後狀態仍是沒變,那麼繼續print(e.is_set()) ##不管前面的wait的timeout是否經過,個人狀態都不會所以改變#紅綠燈模型#控制交通燈的進程import timeimport randomdef traffic_light(e): print('\033[1;31m 紅燈亮\033[0m') while True: time.sleep(2) if e.is_set(): print('\033[1;31m 紅燈亮\033[0m') e.clear() else: print('\033[1;32m 綠燈亮\033[0m') e.set()##車 等或者經過def car(id,e): if not e.is_set(): print('car %s 等待' % id) e.wait() print('car %s 經過' %id)def police_car(id,e): if not e.is_set(): e.wait(timeout=0.5) print('police car %s 經過' %id)##主進程 啓動交通控制燈 啓動車的進程if __name__ == '__main__': e = Event() p = Process(target=traffic_light,args=(e,)) p.start() car_lst = [car,police_car] for i in range(20): p = Process(target=random.choice(car_lst),args=(i,e)) p.start() time.sleep(random.randrange(0,3,2))總結進城之間的數據是隔離的 進程御錦城之間是不能自由的交換內存數據的 全局的變量在子進程中修改 其餘進程是感知不到的守護進程 特色 生命週期只和主進程的代碼有關係,和其餘子進程不要緊\ 用處 報活多進程啓動tcp協議的socket來完成併發進程的同步控制---進程之間有一些簡單的信號傳遞,可是用戶不能感知,且用戶不能傳遞本身想傳遞的內容 鎖 信號量 鎖+計數器實現 事件 wait