Python之程序 執行緒 協程(生產者消費者模型)

2021-10-04 22:36:52 字數 1888 閱讀 3151

本篇主要總結一下非常有名的生成者消費者模型

概念引用

1、為什麼要使用生產者和消費者模型?

2、什麼是生產者消費者模型?

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

這就像,在餐廳,廚師做好菜,不需要直接和客戶交流,而是交給前台,而客戶去飯菜也不需要不找廚師,直接去前台領取即可,這也是乙個結耦的過程。

測試**和結果

1、測試**:

import time,random

import queue,threading #匯入佇列和執行緒模組

q = queue.queue(

)#建立乙個佇列

#建立乙個生產者

defproducer

(name)

: count =

0while count <10:

print

("生產中......"

) time.sleep(random.randrange(3)

)#讓生產時間為3秒

#把生產的產品加入到佇列q中

q.put(count)

print

('生產者 %s 已經完成 %s 號產品!'

%(name, count)

)

count +=

1#q.task_done()

#q.join()

print

("上架完成!"

)#建立乙個消費者

defconsumer

(name)

: count =

0while count <10:

time.sleep(random.randrange(4)

)#讓消費時間為0到4秒的隨機數

ifnot q.empty():

#如果架子上有產品

#用get來表示開始消費

data = q.get(

)#q.task_done()

#q.join()

print

(data)

print

('消費者 %s 已經消費了 %s 號產品'

%(name, data)

)else

:print

("架子上沒有產品了!"

) count +=

1p1 = threading.thread(target=producer, args=

('a',)

)c1 = threading.thread(target=consumer, args=

('b',)

)#加上這兩個就能做成供大於需的效果

# c2 = threading.thread(target=consumer, args=('c',))

# c3 = threading.thread(target=consumer, args=('d',))

p1.start(

)c1.start(

)#加上這兩個就能做成供不應求的效果

# c2.start()

# c3.start()

2、測試結果:

Python 程序 執行緒 協程

程序和執行緒之間的關係 執行緒是屬於程序的,執行緒執行在程序空間內,同一程序所產生的執行緒共享同一記憶體空間,當程序退出時該程序所產生的執行緒都會被強制退出並清除。執行緒可與屬於同一程序的其它執行緒共享程序所擁有的全部資源,但是其本身基本上不擁有系統資源,只擁有一點在執行中必不可少的資訊 如程式計數...

Python 程序,執行緒, 協程

程序是系統進行資源分配和排程的乙個獨立單位 最小單位 程序的幾個狀態 空 新建 建立執行乙個程式的新程序,可能的事件有 新的批處理作業 互動登入 終端使用者登入到系統 作業系統因為提供一項服務而建立 由現有的程序派生等。新建 就緒 作業系統準備好再接納乙個程序時,把乙個程序從新建態轉換為就緒態。就緒...

程序 執行緒 協程

多程序多執行緒的最終目地都是為了加快任務處理的時間,但是受限於cpu核數 只有多核才能實現並行,任務耗時 單核任務耗時 cpu核數 那麼在單核上執行多程序多執行緒是不是沒有用了,加快不了處理的速度了?答案肯定是不是的,不然這個東西設計出來太雞肋了,那它們加快處理的原理是什麼呢?乙個程序耗時 b程序耗...