#多程序的生產者消費者模型#佇列
#佇列是程序安全的,同時只能有乙個程序從佇列中取到資料
#生產者消費者模型
#為什麼要這個模型
#這個模型經常性的解決資料的供需不平衡的問題
#經常有兩撥人,一撥是生產資料的,一撥是消費資料的。
#消費者指的是使用資料處理資料的一端
#生產資料的一端生產的資料過快
#當生產資料過快時,消費資料過慢時,可以弄出乙個程序佇列,將生產的資料放入到佇列中,消費資料端可以開多個程序從這個程序佇列中消費資料
#當生產資料過慢時,消費資料過快時,可以弄出乙個程序佇列,多幾個程序作為生產者,將生產的資料放到佇列中,消費者從佇列中消費資料
#生產者 消費者 模型
#生產者,每乙個生產者就是乙個程序,每乙個消費者就是乙個程序
#下面的例子,當生產者生產的東西全部生產完了以後,消費者程序還一直阻塞在佇列那裡等待資料,讓消費者程序結束使用的方法是,在阻塞等待生產者執行後了後,向佇列中插入了
#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...