26 生產者消費者模型

2022-06-06 13:09:12 字數 2909 閱讀 5346

一、ipc

空間復用  中記憶體隔離開了多個程序直接不能直接互動

ipc指的就是程序間通訊

幾種方式

1、建立乙個共享檔案

缺點:效率較低

優點:理論上交換的資料量可以非常大

適用於:互動不頻繁,且資料量較大的情況

2、共享記憶體

缺點:資料量不大

優點:效率高

適用於:互動頻繁,但是資料量小

3、管道

管道也是基於檔案的,它是單向的,程式設計比較複雜

4、socket

程式設計複雜,更適用於基於網路來交換資料

二、manager的基本使用

是一種可以給我們建立程序 同步的容器,但是沒有處理安全問題的能力,使用的並不常用,了解即可!
from multiprocessing import process, manager

def task(data):

for i in range(100):

data['num'] -= 1

print('子 over')

if __name__ == '__main__':

data =

m = manager() # 建立乙個管理器

syncdict = m.dict(data) # 讓管理器建立乙個程序同步的字典

# 沒有給你處理鎖

p = process(target=task, args=(syncdict,))

p.start()

p.join()

print(data)

print(syncdict)

三、queue

queue翻譯為佇列 , 是一種特殊的容器,特殊之處在於訪問順序為先進先出

可以幫我們完成程序間通訊

from multiprocessing import queue

q = queue(2) # 建立佇列,並且只能同時訪問兩個資料

q.put(1)

q.put(2)

# put(self , block (布林值,判斷是否為阻塞) , timeout = none(設定時間))

q.put(3) # 預設是阻塞的,當容器中沒有位置了就阻塞,直到有人從裡面取走元素為止

print(q.get())

print(q.get())

print(q.get()) # 預設是阻塞的,當容器中沒有位置了就阻塞,直到有人存入元素為止

拓展:棧

也是一種特殊的容器 特殊在於 訪問順序為先進後出

函式呼叫棧

呼叫函式時 稱之為函式入棧 函式執行結束返回值為出棧

四、生產者消費者模型​ 模型就是套路 , 就是解決某種固定問題的固定套路

生產者:泛指產生資料的乙方

消費者:泛指處理資料的乙方

具體解決方法:

1、先將雙方解開耦合,讓不同的程序負責不同的任務

2、提供乙個共享的容器,來平衡雙方的能力,之所以用程序佇列是因為佇列可以在程序間共享

案例:

from multiprocessing import process, joinablequeue

# import requests

import re, os, time, random

"""生產者 負責生產熱狗

消費者 負責吃熱狗

"""# 生產者任務

def product(q, name):

for i in range(5):

dog = "%s的熱狗%s" % (name, (i + 1))

time.sleep(random.random())

print("生產了", dog)

q.put(dog)

# 吃熱狗

def customer(q):

while true:

dog = q.get()

time.sleep(random.random())

print("消費了%s" % dog)

q.task_done() # 標記這個任務處理完成

if __name__ == '__main__':

# 建立乙個雙方能共享的容器

q = joinablequeue()

# 生產者程序

p1 = process(target=product, args=(q, "上海分店"))

p2 = process(target=product, args=(q, "北京分店"))

p1.start()

p2.start()

# 消費者程序

c = process(target=customer, args=(q,))

# c.daemon = true # 可以將消費者設定為守護程序 當主程序確認 任務全部完成時 可以隨著主程序一起結束

c.start()

p1.join()

p2.join() # **走到這裡意味著生產方完成

q.join() # 意味著佇列中的任務都處理完成了

# 結束所有任務

c.terminate() # 直接終止消費者程序

5 12 生產者和消費者

一 生產者和消費者之間的關係 1 生產者將生產出來的資訊不斷存入乙個區域內,消費者將資訊從該區域內不斷讀取出來 生產者錄入資訊 消費者讀取資訊 例 電影票 public class movie public void setname string name public string getinfo...

6 1 生產者 消費者問題

在多執行緒程式中,執行緒之間通常存在分工。在一種常見模式中,一些執行緒是生產者,一些是消費者。需要強制執行幾個同步約束才能使此系統正常工作 在緩衝區中新增或刪除專案時,緩衝區處於不一致狀態。因此,執行緒必須具有對緩衝區的獨佔訪問許可權。如果消費者執行緒在緩衝區為空時到達,則會阻塞,直到生產者新增新專...

Python 4 12 生產者消費者模型

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