python佇列 生產者消費者模型

2021-09-24 12:32:50 字數 1728 閱讀 4108

生產者消費者模型:

在軟體開發的過程中,經常碰到這樣的場景:

某些模組負責生產資料,這些資料由其他模組來負責處理(此處的模組可能是:函式、執行緒、程序等)。產生資料的模組稱為生產者,而處理資料的模組稱為消費者。在生產者與消費者之間的緩衝區稱之為倉庫。生產者負責往倉庫運輸商品,而消費者負責從倉庫裡取出商品,這就構成了生產者消費者模式。

舉個例子,我們去郵局投遞信件,如果不使用郵箱(也就是緩衝區),你必須得把信直接交給郵遞員。有同學會說,直接給郵遞員不是挺簡單的嘛?其實不簡單,你必須 得認識誰是郵遞員,才能把信給他。這就產生了你和郵遞員之間的依賴(相當於生產者和消費者的強耦合)。萬一哪天郵遞員 換人了,你還要重新認識一下(相當於消費者變化導致修改生產者**)。而郵箱相對來說比較固定,你依賴它的成本就比較低(相當於和緩衝區之間的弱耦合)。

繼續上面的例子,如果我們不使用郵箱,就得在郵局等郵遞員,直到他回來,把信件交給他,這期間我們啥事兒都不能幹(也就是生產者阻塞)。或者郵遞員得挨家挨戶問,誰要寄信(相當於消費者輪詢)。

我們再拿寄信的例子,假設郵遞員一次只能帶走1000封信,萬一碰上情人節(或是聖誕節)送賀卡,需要寄出去的信超過了1000封,這時候郵箱這個緩衝區就派上用場了。郵遞員把來不及帶走的信暫存在郵箱中,等下次過來時再拿走。

舉個例子:

import threading,time,random,queue

def product(num):

'''生產者函式,負責向佇列裡放入資料'''

c = threading.thread(target = customer)           # 建立消費者程序,並設定成守護程序,生產結束,消費結束

c.setdaemon(true)   # 為什麼不用empty()判斷,因為消費比生產快,程式就會結束

c.start()

count = 0          # 計數器

while count 

name = str(num)+str(count)        # 生成不同的名字

q.put(name)                       # 放入佇列

print('服務員{} 有時間!'.format(name))      #列印提示

sec = random.randint(1,5)         # 隨機延遲

time.sleep(sec)                   

count += 1                        # 增加計數

def customer():

'''消費者函式,從佇列取出資料'''

while true:

sec = random.randint(1,5)

time.sleep(sec)

name = q.get()                # 從佇列取出資料,如果沒有資料,阻塞

print ('服務員{} 被叫走了!'.format(name))

q = queue.queue()

l = 

for i in range(2):

p = threading.thread(target = product, args=(i,))

p.start()

for i in l:

i.join()

python 生產者 消費者

from bs4 import beautifulsoup import requests import time import multiprocessing as mp import re from multiprocessing import queue from multiprocessin...

佇列,生產者消費者模型

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...

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...