Python 4 12 生產者消費者模型

2021-10-19 12:00:37 字數 3240 閱讀 3464

什麼是生產者消費者模式

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

例:

import time

from multiprocessing import queue, process

def producer(q):

for i in range(5):

res = '包子%s' % i

time.sleep(0.5)

print('生產者生產了%s' % res)

q.put(res)

def consumer(q):

while true:

res = q.get()

if res is none: break

time.sleep(1)

print('消費者吃了%s' % res)

if __name__ == '__main__':

# 容器

q = queue()

# 生產者們

p1 = process(target=producer, args=(q,))

p2 = process(target=producer, args=(q,))

p3 = process(target=producer, args=(q,))

# 消費者們

c1 = process(target=consumer, args=(q,))

c2 = process(target=consumer, args=(q,))

p1.start()

p2.start()

p3.start()

c1.start()

c2.start()

p1.join()

p2.join()

p3.join()

q.put(none) # 生產者給消費者發出訊號,容器裡沒有包子了,有幾個消費者就要發幾次訊號

q.put(none)

print('主')

結果:生產者生產了包子0

生產者生產了包子0

生產者生產了包子0

生產者生產了包子1

生產者生產了包子1

生產者生產了包子1

生產者生產了包子2

消費者吃了包子0

生產者生產了包子2

消費者吃了包子0

生產者生產了包子2

生產者生產了包子3

生產者生產了包子3

生產者生產了包子3

生產者生產了包子4

消費者吃了包子0

生產者生產了包子4

消費者吃了包子1

生產者生產了包子4

主消費者吃了包子1

消費者吃了包子1

消費者吃了包子2

消費者吃了包子2

消費者吃了包子2

消費者吃了包子3

消費者吃了包子3

消費者吃了包子3

消費者吃了包子4

消費者吃了包子4

消費者吃了包子4

當容器裡沒有包子的時候,需要生產者一一給消費者發出訊號,如此顯得比較low,joinablequeue提供了一種解決此問題的方法。

import time

from multiprocessing import process, joinablequeue

def producer(q):

for i in range(5):

res = '包子%s' % i

time.sleep(0.5)

print('生產者生產了%s' % res)

q.put(res)

q.join() # 等消費者取沒了再結束程序

def consumer(q):

while true:

res = q.get()

if res is none: break

time.sleep(1)

print('消費者吃了%s' % res)

q.task_done() # 消費者給生產者發訊號

if __name__ == '__main__':

# 容器

q = joinablequeue()

# 生產者們

p1 = process(target=producer, args=(q,))

p2 = process(target=producer, args=(q,))

p3 = process(target=producer, args=(q,))

# 消費者們

c1 = process(target=consumer, args=(q,))

c2 = process(target=consumer, args=(q,))

c1.daemon = true

c2.daemon = true

p1.start()

p2.start()

p3.start()

c1.start()

c2.start()

p1.join()

p2.join()

p3.join() # 這一步執行完後,消費者已經將包子吃完了,所以應該設定消費者為守護程序

print('主')

結果:生產者生產了包子0

生產者生產了包子0

生產者生產了包子0

生產者生產了包子1

生產者生產了包子1

生產者生產了包子1

生產者生產了包子2

消費者吃了包子0

生產者生產了包子2

消費者吃了包子0

生產者生產了包子2

生產者生產了包子3

生產者生產了包子3

生產者生產了包子3

生產者生產了包子4

消費者吃了包子0

生產者生產了包子4

消費者吃了包子1

生產者生產了包子4

消費者吃了包子1

消費者吃了包子1

消費者吃了包子2

消費者吃了包子2

消費者吃了包子2

消費者吃了包子3

消費者吃了包子3

消費者吃了包子3

消費者吃了包子4

消費者吃了包子4

消費者吃了包子4

python3 生產者消費者

code from queue import queue from threading import thread 用來表示終止的特殊物件 sentinel object a thread that produces data def producer out q for i in range 10...

5 12 生產者和消費者

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

6 1 生產者 消費者問題

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