121 python程序中的線程操做-隊列queue

1、線程隊列

queue隊列:使用方法同進程的Queue同樣python

若是必須在多個線程之間安全地交換信息時,隊列在線程編程中尤爲有用。編程

重要:安全

q.put():往隊列裏面放值,當參數block=Ture的時候,timeout參數將會有做用,當隊列已經滿了的時候,在往裏面放值時,block爲True程序將會等待timeout的時間,過了時間程序會報錯,block若是爲Flase時,程序不會等待直接報錯線程

q.get():從隊列裏面取值,當參數block=Ture的時候,timeout參數將會有做用,當隊列已經空了的時候,在從裏面取值時,block爲True程序將會等待timeout的時間,過了時間程序會報錯,block若是爲Flase時,程序不會等待直接報錯code

q.task_done():使用者使用此方法發出信號,表示q.get()返回的項目已經被處理。若是調用此方法的次數大於從隊列中刪除的項目數量,將引起ValueError異常。對象

q.join():生產者將使用此方法進行阻塞,直到隊列中全部項目均被處理。阻塞將持續到爲隊列中的每一個項目均調用q.task_done()方法爲止。隊列

2、線程隊列的取值方式

2.1 先進先出

class queue.Queue(maxsize=0)進程

q = queue.Queue():不加參數表明隊列能夠無限的放數據ci

q = queue.Queue() #不加參數表明隊列能夠無限的放數據
q.put('Cecilia陳')
q.put('xichen')

print(q.get())
print(q.get())

'''
結果:
Cecilia陳
xichen
'''

2.2 後進先出

class queue.LifoQueue(maxsize=0)get

q = Lifo.Queue():不加參數表明隊列能夠無限的放數據

q = queue.LifoQueue() #不加參數表明隊列能夠無線的放數據
q.put('Cecilia陳')
q.put('xichen')

print(q.get())
print(q.get())
'''
結果:
xichen
Cecilia陳
'''

3、隊列存數據時能夠設置優先級

class queue.priorityQueue(maxsize=0)

q = queue.priorityQueue():不加參數表明隊列能夠無限的放數據

3.1 優先級隊列

# 3.優先級隊列
q = queue.PriorityQueue() #不加參數表明隊列能夠無線的放數據
#put進入一個元組,元組的第一個元素是優先級(一般是數字,也能夠是非數字之間的比較),數字越小優先級越高
q.put((2,'Cecilia陳'))
q.put((1,'xichen'))
q.put((5,'xuchen'))

print(q.get())
print(q.get())
print(q.get())
'''
# 結果(數字越小優先級越高,優先級高的優先出隊):
結果:
(1, 'xichen')
(2, 'Cecilia陳')
(5, 'xuchen')
'''

3.2 方法說明

maxsize是一個整數,它設置能夠放置在隊列中的項數的上限。一旦達到此大小,插入將阻塞,直到使用隊列項。若是maxsize小於或等於零,則隊列大小爲無窮大。

p.put():放值的時候,放的是一個元組()

exception queue.Empty:異常隊列。空:當對空的隊列對象調用非阻塞 get() 或 get_nowait() 時引起異常,也就是說隊列爲空的時候,再取值就會報錯

exception queue.Full:異常隊列。Full:當對已滿的隊列對象調用非阻塞put() 或 put_nowait() 時引起異常。也就是說當隊列已滿的時候,再往裏面當值的時候將會報錯

Queue.qsize ():

empty():若是爲空,返回True

Queue.full():若是已滿,返回True

put_nowait(item):等同於put(item, False)。

get_nowait():等同於get(False)。

提供了兩種方法來支持跟蹤已加入隊列的任務是否已被守護進程使用者線程徹底處理:

task_done():表示之前加入隊列的任務已經完成。由隊列使用者線程使用。對於用於獲取任務的每一個get(),後續對task_done()的調用告訴隊列任務上的處理已經完成。若是join(當前處於阻塞狀態,那麼在處理完全部項以後,它將繼續運行(這意味着對於已經放入隊列()的每一個項,都收到了task_done()調用)。

若是調用次數超過放置在隊列中的項的次數,則引起ValueError。

Queue.join():塊直到隊列被消費完畢。

相關文章
相關標籤/搜索