Python之Queue模組以及生產消費者模型

2021-08-15 03:49:44 字數 2859 閱讀 7264

佇列類似於一條管道,元素先進先出,進put(arg),取get()

有一點需要注意的是:佇列都是在記憶體中操作,程序退出,佇列清空,另外,佇列也是乙個阻塞的形態.

佇列有很多中,但都依賴模組queue

|佇列方式|特點|

|---|---|

|queue.queue|先進先出佇列|

|queue.lifoqueue|後進先出佇列|

|queue.priorityqueue|優先順序佇列|

|queue.deque|雙線佇列|

方法用法說明

put放資料,queue.put()預設有block=true和timeout兩個引數。當block=true時,寫入是阻塞式的,阻塞時間由timeout確定。當佇列q被(其他執行緒)寫滿後,這段**就會阻塞,直至其他執行緒取走資料。queue.put()方法加上 block=false 的引數,即可解決這個隱蔽的問題。但要注意,非阻塞方式寫佇列,當佇列滿時會丟擲 exception queue.full 的異常

get取資料(預設阻塞),queue.get([block[, timeout]])獲取佇列,timeout等待時間

empty

如果隊列為空,返回true,反之false

qsize

顯示佇列中真實存在的元素長度

maxsize

最大支援的佇列長度,使用時無括號

join

實際上意味著等到隊列為空,再執行別的操作

task_done

在完成一項工作之後,queue.task_done()函式向任務已經完成的佇列傳送乙個訊號

full

如果佇列滿了,返回true,反之false

import

queue

q=queue.queue(5

) #如果不設定長度,預設為無限長

print(q.maxsize) #注意沒有括號

q.put(123

)q.put(456

)q.put(789

)q.put(100

)q.put(111

)q.put(233

)print(q.get())

print(q.get())

如此列印時候是阻塞的,為什麼呢,因為建立了5個元素長度的佇列,但我put進去了6個,所以就阻塞了.如果少寫乙個能顯示出正確的123.

q = queue.lifoqueue()

q.put(12

)q.put(34

)print(q.get())

需要注意的是,優先順序佇列put的是乙個元組,(優先順序,資料),優先級數越小,級別越高

q = queue.priorityqueue()

q.put((3

,'aaaaa'

))q.put((3

,'bbbbb'

))q.put((1

,'ccccc'

))q.put((3

,'ddddd'

))print(q.get())

print(q.get())

out:

(1

, 'ccccc')(3

, 'aaaaa'

)

q = queue.deque()))

)print(q.pop())

print(q.popleft())

out:

456

780

從下面圖中可以發現生產者和消費者之間用中間類似乙個佇列一樣的東西串起來。這個佇列可以想像成乙個存放產品的「倉庫」,生產者只需要關心這個「倉庫」,並不需要關心具體的消費者,對於生產者而言甚至都不知道有這些消費者存在。對於消費者而言他也不需要關心具體的生產者,到底有多少生產者也不是他關心的事情,他只要關心這個「倉庫」中還有沒有東西。這種模型是一種松耦合模型。這樣可以回答我上面提出的第乙個問題。這個模型的產生就是為了復用和解耦。比如常見的訊息框架(非常經典的一種生產者消費者模型的使用場景)activemq。傳送端和接收端用topic進行關聯。這個topic可以理解為我們這裡「倉庫」的位址,這樣就可以實現點對點和廣播兩種方式進行訊息的分發。

解決程式解耦,較少的資源解決高併發的問題

import

queue,threading,time

q=queue.queue()

defproduct

(arg):

while

true

: q.put(str(arg)+

'包子'

)def

consumer

(arg):

while

true

: print(arg,q.get())

time.sleep(2

)for

i in

range(3

): t=threading.thread(target=product,args=(i,))

t.start()

for j in

range(20

): t=threading.thread(target=consumer,args=(j,))

t.start()

Python 佇列模組 Queue

佇列queue模組 管道 subprocess stdin stdout stderr 佇列 管道 鎖 佇列 先進先出 堆疊 先進後出 from multiprocessing import queue 建立乙個佇列 q queue 5 括號內可以傳數字 標示生成的佇列最大可以同時存放的資料量 往佇...

Python中模組之queue的功能介紹

佇列主要要分為兩種 1.雙向佇列 2.單項佇列建立單項佇列 格式 queue.queue obj 例如 que queue.queue abc 返回值 queue.queue 建立單項佇列時的引數可以是任意物件,無論傳入的引數是什麼,該佇列始終是空的。empty 判斷佇列是否是空的 格式 queue...

Python 中的queue模組

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!作為標準庫中的queue模組,在實際的開發中也是很常見的。其實資料結構這種東西,在任何的程式語言中都是相通的,無非表達方式有些不同罷了。那麼,今天就來看看如何在python中使用佇列。import queueq queue queue maxsiz...