訊息佇列與生產者消費者模型

2022-09-16 00:42:08 字數 2918 閱讀 7672

目錄生產者消費者模型

我們知道程序之間資料是相互隔離的,要想實現程序間的通訊(ipc機制),就必須借助於一些技術才可以,比如multiprocessing模組中的:佇列和管道,這兩種方式都是可以實現程序間資料傳輸的,由於佇列是管道+鎖的方式實現,所以我們著重研究佇列即可

佇列支援多個人從佇列的一端放入資料,同樣支援多個人從佇列的另一端取資料(先進先出)

queue([maxsize]) # 建立共享的程序佇列 佇列底層使用管道和鎖定實現。

# 引數 :maxsize是佇列中允許的最大項數。如果省略此引數,則無大小限制。

from multiprocessing import queue

q = queue(5) # 規定數值個數

# 存放資料

q.put(111)

q.put(222)

q.put(333)

q.put(444)

q.put(555)

q.put(555) # 第六個放不進去,但是程式會卡在這,會等待其他人取出乙個後再執行

print(q.full()) # 判斷是否存滿 返回true或false

# 取出資料

print(q.get())

print(q.get())

print(q.get())

print(q.get())

print(q.get()) # 同理,如果佇列內空了,也會等待有值的時候取

print(q.get_nowait()) # 如果沒值直接報錯

from multiprocessing import queue

def producer(q):

q.put('子程序p放的資料')

def consumer(q):

print(q.get('子程序c取的資料'))

在併發程式設計中使用生產者和消費者模式能夠解決絕大多數併發問題。該模式通過平衡生產線程和消費執行緒的工作能力來提高程式的整體處理資料的速度。

生產者消費者模式是通過乙個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過阻塞佇列來進行通訊,所以生產者生產完資料(做包子的)之後不用等待消費者(吃包子的)處理,直接扔給阻塞佇列(盤子),消費者不找生產者要資料,而是直接從阻塞佇列裡取,阻塞佇列就相當於乙個緩衝區,平衡了生產者和消費者的處理能力。

print(f'生產了')

time.sleep(0.1)

def consumer(q, name):

while true:

data = q.get()

print(f'把吃了.')

q.task_done()

if __name__ == '__main__':

q = joinablequeue()

p1 = process(target=producer, args=(q, '大廚jason', '蔥油餅'))

p2 = process(target=producer, args=(q, '印度阿三', '狗屎咖哩'))

p3 = process(target=producer, args=(q, '蒙古漢子', '馬奶酒'))

c = process(target=consumer, args=(q, '大胃王老八'))

p1.start()

p2.start()

p3.start()

'''這裡必須給消費者加守護程序模式,因為不加的話執行到列印'主程序'的時候因為子程序消費者還在等著處理

所以程式就會停在這.加上守護程序模式就可以實現執行完主程序**就可以結束主程序及其子程序.所以加守護進

程模式的時候要確保生產者生產完畢以及消費者處理完畢,所以在下面要加q.join來阻塞住.'''

c.daemon = true

c.start()

p1.join()

p2.join()

p3.join()

'''呼叫此方法進行阻塞,直到佇列中所有的專案均被消費者處理完畢方才繼續向下執行(主要用在生產者生產完後使用),

搭配q.task_done()使用,q.task_done()是當佇列裡沒有專案的時候會發出訊號給join,然後join解除阻塞.

q.task_done()常用在消費者裡來檢測佇列裡的專案進度.'''

q.join()

print('主程序')

佇列,生產者消費者模型

from multiprocessing import process,lock import os,time,json with open user w encoding utf 8 as f dic json.dump dic,f def search with open user r enco...

迴圈佇列 生產者與消費者模型

迴圈佇列可以實現乙個生產者與乙個消費者模型,不使用鎖。迴圈佇列 容量大小為10 生產者執行緒 把從0遞增的整數依次push到佇列,佇列滿了就等1s 尾部不儲存,也就是最大存9個數 消費者執行緒 每3s從佇列pop乙個元素。xiongli localhost data struct a.out pus...

生產者與消費者模型

先介紹幾個函式 生產消費者模型 二者共享資料value,這裡,生產者是producter,消費者是consumer。生產者負責放物品到value中,消費者使用wait 等待生產者的通知。當得到通知後,消費者取出物品,並且用notify 通知生產者,可以再放下一批物品。例項 package cn.ed...