進程同步

進程同步工具有前後順序 就是同步進程之間 就是一部但願本來一部的多進程操做,維持一個順序鎖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
相關文章
相關標籤/搜索