導航:首頁 > 編程語言 > python隊列動態增加

python隊列動態增加

發布時間:2023-08-05 06:13:27

python Queue 入門

Queue 叫隊列,是數據結構中的一種,基本上所有成熟的編程語言都內置了對 Queue 的支持。

Python 中的 Queue 模塊實現了多生產者和多消費者模型,當需要在多線程編程中非常實用。而且該模塊中的 Queue 類實現了鎖原語,不需要再考慮多線程安全問題。

該模塊內置了三種類型的 Queue,分別是 class queue.Queue(maxsize=0) , class queue.LifoQueue(maxsize=0) 和 class queue.PriorityQueue(maxsize=0) 。它們三個的區別僅僅是取出時的順序不一致而已。

Queue 是一個 FIFO 隊列,任務按照添加的順序被取出。

LifoQueue 是一個 LIFO 隊列,類雀指似堆棧,後添加的任務先被取出。

PriorityQueue 是一個優先順序隊列,隊列裡面的肆歲友任務按照優先順序排序,優先順序高的先被取出。

如你所見,就是上面所說的三種不同類型的內置隊列,其中 maxsize 是個整數,用於設置可以放入隊列中的任務數的上限。當達到這個大小的時候,插入操作將阻塞至隊列中的任務被消費掉。如果 maxsize 小於等於零,則隊列尺寸為無限大。

向隊列中添加任務,直接調用 put() 函數即可

put() 函數完整的函數簽名如下 Queue.put(item, block=True, timeout=None) ,如你所見,該函數有兩個可選參數。

默認情況下,在隊列滿時,該函數會一直阻塞,直到隊列中有空餘的位置可以添加任務為止。如果 timeout 是正數,則最多阻塞 timeout 秒,如果這段時間內還沒有空餘的位置出來,則會引發 Full 異常。

當 block 為 false 時,timeout 參數將失效。同時如果隊列中沒有空餘的位置可添加任務則會引發 Full 異常,否則會直接把任務放入隊列並返回,不會阻塞。

另外,還可以通過 Queue.put_nowait(item) 來添加任務,相當於 Queue.put(item, False) ,不再贅述。同樣,在隊列滿時,該操作會引發 Full 異常。

從隊列中獲取任務,直接調用 get() 函數即可。

與 put() 函數一樣, get() 函數也有兩個可選參數,完整簽名如下 Queue.get(block=True, timeout=None) 。

默認情況下,當隊列空時調用該函數會一直阻塞,直到隊列中有任務可獲取為止。如果 timeout 是正數,則最多阻塞 timeout 秒,如果這段時間內還沒有任務可獲取,則會引發 Empty 異常。

當 block 為 false 時,timeout 參數將失效。同時如果隊列中沒有任務可獲取則會立刻引發 Empty 異常,否則會直接獲取一個任務並返回,不會阻塞。

另外,還可以通過 Queue.get_nowait() 來獲取任務,相當於 Queue.get(False) ,不再贅述。同裂槐樣,在隊列為空時,該操作會引發 Empty 異常。

Queue.qsize() 函數返回隊列的大小。注意這個大小不是精確的,qsize() > 0 不保證後續的 get() 不被阻塞,同樣 qsize() < maxsize 也不保證 put() 不被阻塞。

如果隊列為空,返回 True ,否則返回 False 。如果 empty() 返回 True ,不保證後續調用的 put() 不被阻塞。類似的,如果 empty() 返回 False ,也不保證後續調用的 get() 不被阻塞。

如果隊列是滿的返回 True ,否則返回 False 。如果 full() 返回 True 不保證後續調用的 get() 不被阻塞。類似的,如果 full() 返回 False 也不保證後續調用的 put() 不被阻塞。

queue.Queue() 是 FIFO 隊列,出隊順序跟入隊順序是一致的。

queue.LifoQueue() 是 LIFO 隊列,出隊順序跟入隊順序是完全相反的,類似於棧。

優先順序隊列中的任務順序跟放入時的順序是無關的,而是按照任務的大小來排序,最小值先被取出。那任務比較大小的規則是怎麼樣的呢。

注意,因為列表的比較對規則是按照下標順序來比較的,所以在沒有比較出大小之前 ,隊列中所有列表對應下標位置的元素類型要一致。

好比 [2,1] 和 ["1","b"] 因為第一個位置的元素類型不一樣,所以是沒有辦法比較大小的,所以也就放入不了優先順序隊列。

然而對於 [2,1] 和 [1,"b"] 來說即使第二個元素的類型不一致也是可以放入優先順序隊列的,因為只需要比較第一個位置元素的大小就可以比較出結果了,就不需要比較第二個位置元素的大小了。

但是對於 [2,1] 和 1 [2,"b"] 來說,則同樣不可以放入優先順序隊列,因為需要比較第二個位置的元素才可以比較出結果,然而第二個位置的元素類型是不一致的,無法比較大小。

綜上,也就是說, 直到在比較出結果之前,對應下標位置的元素類型都是需要一致的

下面我們自定義一個動物類型,希望按照年齡大小來做優先順序排序。年齡越小優先順序越高。

本章節介紹了隊列以及其常用操作。因為隊列默認實現了鎖原語,因此在多線程編程中就不需要再考慮多線程安全問題了,對於程序員來說相當友好了。

② python生成多個隊列

q=[]
foriinrange(9):
q.append(Queue())

③ python3中關於matplotlib的figure內數據動態更新的問題

你可以參考一下下面的代碼:
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10*np.pi, 100)
y = np.sin(x)

plt.ion() #Setting interactive mode on is essential: plt.ion(). This controls if the figure is redrawn every draw() command.
fig = plt.figure()
ax = fig.add_subplot(111)
line1, = ax.plot(x, y, 'b-')

for phase in np.linspace(0, 10*np.pi, 100):
line1.set_ydata(np.sin(0.5 * x + phase))
fig.canvas.draw() #不斷的更新

④ 關於python動態添加屬性和方法的意義

通過對象的實例,在外部為其添加屬性,這種做法應該是很少見的。原因很簡單:破壞封裝。雖然Python可以做到,但並不代表隨意使用這種做法是妥當的。

添加的屬性可以和原有的組合使用的,有回答已經給出了例子。

我覺得有必要提一下self或者說方法的第一個參數是什麼。

需要注意的是,通過實例為類屬性賦值[7],會「遮蓋」類屬性。即,賦值只是為實例的屬性賦值,而未改動類的屬性。需要改動類屬性的話,應該使用類名的方式。

感興趣的話可以查查Python的Mixin,這是通過動態繼承添加屬性和方法的做法。

閱讀全文

與python隊列動態增加相關的資料

熱點內容
照片pdf格式轉換成JPG格式 瀏覽:111
手機解除設置加密鎖 瀏覽:595
藍牙如何互相傳app 瀏覽:939
管家婆為什麼登錄不上伺服器 瀏覽:759
方舟編譯器確定時延引擎 瀏覽:997
南京雲伺服器租賃 瀏覽:431
程序員司機等職業生女孩 瀏覽:776
邊緣雲伺服器常態化 瀏覽:590
win10雙顯拖動文件夾卡頓 瀏覽:215
php棋牌游戲開發 瀏覽:450
壓縮空氣水泵安裝圖 瀏覽:511
環保伺服器是什麼 瀏覽:475
電腦編輯圖片的app哪個好用 瀏覽:774
下載東西解壓包不見了 瀏覽:31
excel表格怎麼加密與只讀 瀏覽:164
空調壓縮機與冷氣泵 瀏覽:742
對於程序員項目管理的分析 瀏覽:711
80d說明書pdf 瀏覽:935
通信加密機制合同是 瀏覽:492
先行伺服器是什麼鬼 瀏覽:255