程序中的生產者消費者模型

2022-06-22 22:48:14 字數 3882 閱讀 7483

#

多程序的生產者消費者模型#佇列

#佇列是程序安全的,同時只能有乙個程序從佇列中取到資料

#生產者消費者模型

#為什麼要這個模型

#這個模型經常性的解決資料的供需不平衡的問題

#經常有兩撥人,一撥是生產資料的,一撥是消費資料的。

#消費者指的是使用資料處理資料的一端

#生產資料的一端生產的資料過快

#當生產資料過快時,消費資料過慢時,可以弄出乙個程序佇列,將生產的資料放入到佇列中,消費資料端可以開多個程序從這個程序佇列中消費資料

#當生產資料過慢時,消費資料過快時,可以弄出乙個程序佇列,多幾個程序作為生產者,將生產的資料放到佇列中,消費者從佇列中消費資料

#生產者 消費者 模型

#生產者,每乙個生產者就是乙個程序,每乙個消費者就是乙個程序

#下面的例子,當生產者生產的東西全部生產完了以後,消費者程序還一直阻塞在佇列那裡等待資料,讓消費者程序結束使用的方法是,在阻塞等待生產者執行後了後,向佇列中插入了

#none值,消費者判斷佇列中的值為none後,則退出消費者程序。但是因為程序佇列是程序安全的,多個程序乙個時間點上只能有乙個程序獲取到佇列中的資料,所以當有乙個

#消費者拿到佇列中的none後,佇列中就沒有了none,其他消費者就拿不到none無法退出消費者程序,必須要有多個消費者就要向佇列中丟多少

#個none才能讓消費者程序全部結束

#import time

#import random

#from multiprocessing import process, queue##

#def producer(name, food, q):

#'''

#生產者

#name:誰生產

#food:生產了什麼東西

#q:生產出來的東西放到**

#:return:

#'''

#for i in range(4):

#time.sleep(random.randint(1, 3)) # 模擬生產資料的時間

#f = ('%s 生產了%s %s' % (name, food, i)) # 模擬生產資料

#print(f) # 檢視生產的資料

#q.put(f) # 將生產的資料放入到程序佇列中##

def consumer(q, name):

#'''

#消費者

#q:資料在**

#name:誰來消費

#:return:

#'''

#while 1:

#food = q.get()

#if food is none:

#print('%s 獲取到了乙個空' % name)

#break

#print('\033[31m%s 消費了 %s\033[0m' % (name, food))

#time.sleep(random.randint(1, 3))##

if __name__ == '__main__':

#q = queue(20)

#p = process(target=producer, args=('egon', '包子', q))

#p.start()##

p1 = process(target=producer, args=('wusir', '泔水', q))

#p1.start()##

p2 = process(target=consumer, args=(q, 'why'))

#p2.start()##

p3 = process(target=consumer, args=(q, 'jbox'))

#p3.start()##

p.join() # 阻塞等待生產者1程序結束

#p1.join() # 阻塞等待生產者2程序結束##

q.put(none)

#q.put(none)

#下面的例子使用joinablequeue程序佇列實現生產者消費者模型,放入資料到佇列中時,內部多了乙個計數+的機制,從佇列中取資料後,呼叫佇列的task_done方法,將計數-1

#然後在生產者中使用佇列的join阻塞等待佇列的資料全部為空,全部被消費者消費掉,如果資料全被消耗掉了,生產者程序才會結束

import

time

import

random

from multiprocessing import

process, joinablequeue

defproducer(name, food, q):

'''生產者

name:誰生產

food:生產了什麼東西

q:生產出來的東西放到**

:return:

'''for i in range(4):

time.sleep(random.randint(1, 3)) #

模擬生產資料的時間

f = ('

%s 生產了%s %s

' % (name, food, i)) #

模擬生產資料

print(f) #

檢視生產的資料

q.put(f) #

將生產的資料放入到程序佇列中,每放入乙個資料到佇列中後,機制中的count就會被+1

q.join() #

阻塞等待佇列中的資料全部被取走,q佇列中的資料全部被取走則不再阻塞在這裡

defconsumer(q, name):

'''消費者

q:資料在**

name:誰來消費

:return:

'''while 1:

food =q.get()

if food is

none:

print('

%s 獲取到了乙個空

' %name)

break

print('

\033[31m%s 消費了 %s\033[0m

' %(name, food))

time.sleep(random.randint(1, 3))

q.task_done()

#每從佇列中消費了乙個資料後,讓機制中的conut計數減一

if__name__ == '

__main__':

q = joinablequeue(20)

p = process(target=producer, args=('

egon

', '包子'

, q))

p.start()

p1 = process(target=producer, args=('

wusir

', '泔水'

, q))

p1.start()

p2 = process(target=consumer, args=(q, '

why'

)) p2.daemon = true #

設定為守護程序的目的是為了讓主程序的**執行完畢後,該守護程序的**自動結束

p2.start()

p3 = process(target=consumer, args=(q, '

jbox'))

p3.daemon = true #

設定為守護程序的目的是為了讓主程序的**執行完畢後,該守護程序的**自動結束

p3.start()

p.join()

#阻塞等待生產者1程序結束

p1.join() #

阻塞等待生產者2程序結束

print('

生產者程序結束,同時主程序要結束,因為其他兩個消費者程序被設定為守護程序,所以主程序結束後,那兩個消費者守護程序也會結束

')

程序與生產者消費者模型

程序應用 1.遠端執行命令 usr src python coding utf 8 import paramiko,time,re from multiprocessing import process import configparser def cmd remote hostname,port...

生產者消費者模型

1.生產者消費者問題 producer consumer 有限緩衝,多執行緒同步。生產者執行緒和消費者執行緒共享固定大小緩衝區。2.關鍵是保證生產者不會再緩衝區滿時加入資料,消費者不會在緩衝區空時消耗資料。3.解決辦法 讓生產者在緩衝區滿時休眠,等下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒...

生產者消費者模型

生產者與消費者 3,2,1 三種關係 生產者與消費者 互斥,同步 消費者與消費者 互斥 生產者與生產者 互斥 條件變數 int pthread cond destroy pthread cond t cond int pthread cond init pthread cond t restrict...