1. 程式人生 > >互斥鎖 IPC 生產者消費者

互斥鎖 IPC 生產者消費者

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 生產者消費者