1. 程式人生 > >python:生產者與消費者模型

python:生產者與消費者模型

target 代碼 所有 name body style pos 方便 tar

1,生產者與消費者模型的矛盾在於數據供需的不平衡

import time
import random
from multiprocessing import Queue
from multiprocessing import Process
def producer(q,food):
    for i in range(5):
        q.put(%s-%s%(food,i))
        print(生產了%s%food)
        time.sleep(random.random())
    q.put(None)
    q.put(None)
    q.put(None)#有三個消費者因此需要三個信號

def consumer(q,name): while True: food = q.get() if food == None:break print(%s 吃了 %s%(name,food)) if __name__ == __main__: q = Queue() p1 = Process(target=producer,args=(q,‘菠蘿蜜幹)) p1.start() p2 = Process(target=producer, args=(q, ‘酸奶)) p2.start() c1
= Process(target=consumer, args=(q, ‘Rabbit)) c1.start() c2 = Process(target=consumer, args=(q, ‘OrangeCat)) c2.start() c3 = Process(target=consumer, args=(q, ‘CuiHua)) c3.start()
生產者消費者模型
1.消費者要處理多少數據是不確定的
2.所以只能用while循環來處理數據 ,但是while循環無法結束
3.需要生產者發送信號
4.有多少個消費者 就需要發送多少個信號
5.但是發送的信號數量需要根據 生產者和消費者的數量進行計算,所以非常不方便
2,JoinableQueue
import time
import random
from multiprocessing import Process
from multiprocessing import JoinableQueue

def producer(q,food):
    for i in range(5):
        q.put(%s-%s%(food,i))
        print(生產了%s%food)
        time.sleep(random.random())
    q.join()  # 等待消費者把所有的數據都處理完

def consumer(q,name):
    while True:
        food = q.get()   # 生產者不生產還是生產的慢
        print(%s 吃了 %s%(name,food))
        q.task_done()#JoinableQueue內部自帶計數功能,每執行一次task_done,計數減一。
if __name__ == ‘__main__‘:
q = JoinableQueue()
p1 = Process(target=producer,args=(q,‘炒河粉‘))
p1.start()
p2 = Process(target=producer, args=(q, ‘草莓‘))
p2.start()
c1 = Process(target=consumer, args=(q, ‘Rabbit‘))
c1.daemon = True
c1.start()
c2 = Process(target=consumer, args=(q, ‘Orange_Cat‘))
c2.daemon = True
c2.start()
c3 = Process(target=consumer, args=(q, ‘Teddy‘))
c3.daemon = True
c3.start()

p1.join() # 等待p1執行完畢
p2.join() # 等待p2執行完畢


生產者生產的數據全部被消費 —— 生產者進程結束 —— 主進程代碼執行結束 —— 消費者守護進程結束

python:生產者與消費者模型