互斥鎖 IPC 生產者消費者
阿新 • • 發佈:2018-04-26
span png tip empty upload 過程 生產者 大小限制 emp
import json import time import random import os from multiprocessing import Process,Lock mutex=Lock() # 互斥鎖vs join的區別一: # 互斥鎖可以讓一部分代碼(修改共享數據的代碼)串行,而join只能將代碼整體串行 def search(): time.sleep(random.randint(1,3)) with open(‘db.json‘,‘r‘,encoding=‘utf-8‘) as f: dic=json.load(f)print(‘%s 剩余票數:%s‘ %(os.getpid(),dic[‘count‘])) def get(): with open(‘db.json‘,‘r‘,encoding=‘utf-8‘) as f: dic=json.load(f) if dic[‘count‘] > 0: dic[‘count‘]-=1 time.sleep(random.randint(1,3)) with open(‘db.json‘,‘w‘,encoding=‘utf-8‘) as f: json.dump(dic,f)print(‘%s 購票成功‘ %os.getpid()) def task(lock): search() lock.acquire() get() lock.release() if __name__ == ‘__main__‘: for i in range(10): p=Process(target=task,args=(mutex,)) p.start()
互斥鎖得自己加鎖 鎖是一個危險的事 不然成死鎖 所以IPC 機制裏的Queue就是幫我們自動處理鎖的事 用Queue 隊列(推薦使用) 創建隊列的類 Queue([maxsize]):創建共享的進程隊列,Queue是多進程安全的隊列, 可以使用Queue實現多進程之間的數據傳遞。 參數介紹: maxsize是隊列中允許最大項數,省略則無大小限制。1.隊列:隊列類似於一條管道,元素先進先出 需要註意的一點是:隊列都是在內存中操作,進程退出,隊列清空,另外,隊列也是一個阻塞的形態 2.隊列分類 隊列有很多種,但都依賴與模塊queue q.put方法用以插入數據到隊列中,put方法還有兩個可選參數:blocked和timeout。如果blocked為True(默認值),並且timeout為正值,該方法會阻塞timeout指定的時間,直到該隊列有剩余的空間。如果超時,會拋出Queue.Full異常。如果blocked為False,但該Queue已滿,會立即拋出Queue.Full異常。 q.get方法可以從隊列讀取並且刪除一個元素。同樣,get方法有兩個可選參數:blocked和timeout。如果blocked為True(默認值),並且timeout為正值,那麽在等待時間內沒有取到任何元素,會拋出Queue.Empty異常。如果blocked為False,有兩種情況存在,如果Queue有一個值可用,則立即返回該值,否則,如果隊列為空,則立即拋出Queue.Empty異常. q.get_nowait():同q.get(False) q.put_nowait():同q.put(False) q.empty():調用此方法時q為空則返回True,該結果不可靠,比如在返回True的過程中,如果隊列中又加入了項目。 q.full():調用此方法時q已滿則返回True,該結果不可靠,比如在返回True的過程中,如果隊列中的項目被取走。 q.qsize():返回隊列中目前項目的正確數量,結果也不可靠,理由同q.empty()和q.full()一樣 來自 <http://www.cnblogs.com/haiyan123/p/7429568.html>
互斥鎖 IPC 生產者消費者