日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

python判断队列是否为空_python队列Queue

發布時間:2023/12/14 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python判断队列是否为空_python队列Queue 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Queue

Queue是python標準庫中的線程安全的隊列(FIFO)實現,提供了一個適用于多線程編程的先進先出的數據結構,即隊列,用來在生產者和消費者線程之間的信息傳遞

隊列在多線程中可以共享,替代全局變量,無需加互斥鎖。

隊列可以并發的派多個線程,對排列的線程處理,并且每個需要處理線程只需要將請求的數據放入隊列容器的內存中,線程不需要等待,當排列完畢處理完數據后,線程再準時來取數據即可。請求數據的線程只與這個隊列容器存在關系,處理數據的線程down掉不會影響到請求數據的線程,隊列會派給其他線程處理這分數據,它實現了解耦,提高效率。

隊列內會有一個有順序的容器,列表與這個容器是有區別的,列表中數據雖然是排列的,但數據被取走后還會保留,而隊列中這個容器的數據被取后將不會保留。當必須在多個線程之間安全地交換信息時,隊列在線程編程中特別有用。

二、Python四種類型的隊例:

Queue:FIFO 即first in first out 先進先出

LifoQueue:LIFO 即last in first out 后進先出

PriorityQueue:優先隊列,級別越低,越優先

deque:雙邊隊列

from queue import Queue, LifoQueue, PriorityQueue

1、Queue 先進先出隊列:

q = Queue(maxsize=5)

初始化一個隊列,默認是不限定隊列的長度,也可以通過參數指定隊列中數據的maxsize,如果maxsize小于或者等于0,隊列大小沒有限制。

put(i,timeout=2) 方法向隊列中添加元素,timeout以設置隊列中數據滿了之后的等待時間(默認一直等待)

q.put(999, block=False) # block=False,往隊列中添加數據,不等待,如果隊列中數據已滿,則會報錯

from queue import Queue

q = Queue(maxsize=5) #限定最長為5

for i in range(5):

q.put(i,timeout=2)

print(q)

while not q.empty():

print(q.get())

#輸出

0

1

2

3

4

2、LifoQueue 后進先出隊列:

創建隊列和向隊列中添加元素與先進先出隊列完全一致

from queue import LifoQueue

q = LifoQueue(5)

for i in range(5):

q.put(i,timeout=2)

print(q)

while not q.empty():

print(q.get())

#輸出

4

3

2

1

0

3、優先隊列:

from queue import PriorityQueue

import random

q = PriorityQueue(5)

for i in range(5):

x = random.randint(1,99)

q.put((x,f"{i}a"),timeout=2)

print(q)

while not q.empty():

print(q.get())

#輸出

(37, '1a')

(44, '2a')

(52, '4a')

(76, '3a')

(77, '0a')

put傳遞的第一個參數為元組,元組的第一個元素表示數據的優先級

隊列中的數據為元組類型:元組的第一個元素表示數據的優先級,優先級越小的先出來

關于優先級,盡量使用數值,如果全是字符串,會按ASCII碼進行排序

通用方法

1、往隊列中添加數據:q.put( item, block=True, timeout=None)

item為添加的對象

True 往隊列中添加數據,如果隊列中數據已滿,一直等待

bloke=False,往隊列中添加數據,不等待,如果隊列中數據已滿,則報錯

timeout不設置,一直等待

timeout設置后等待超過時間則報錯

其非阻塞版本為`put_nowait`等同于put(item, block=False)

2、從隊列中移除并返回一個數據:q.get([block[, timeout]])

block和timeout用法與put一致

其非阻塞方法為`get_nowait()`相當與get(block=False)

3、判斷隊列中數據是否為空:empty方法 q.empty()

隊列中數據為空,返回True

隊列中數據不為空,返回False

4、判斷隊列中數據是否已滿:full q.full()

隊列中數據已滿,返回True

隊列中數據不滿,返回False

5、獲取隊列中任務數量(多少條數據) q.qsize()

6、task_done()

意味著之前入隊的一個任務已經完成。由隊列的消費者線程調用。每一個get()調用得到一個任務,接下來的task_done()調用告訴隊列該任務已經處理完畢。

如果當前一個join()正在阻塞,它將在隊列中的所有任務都處理完時恢復執行(即每一個由put()調用入隊的任務都有一個對應的task_done()調用)。

7、join()

阻塞調用線程,直到隊列中的所有任務被處理掉。

只要有數據被加入隊列,未完成的任務數就會增加。當消費者線程調用task_done()(意味著有消費者取得任務并完成任務),未完成的任務數就會減少。當未完成的任務數降到0,join()解除阻塞。

總結

以上是生活随笔為你收集整理的python判断队列是否为空_python队列Queue的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。