queue
queue是python標準庫中的線程安全的隊列(fifo)實現,提供了一個適用于多線程編程的先進先出的數據結構,即隊列,用來在生產者和消費者線程之間的信息傳遞
基本fifo隊列
class queue.queue(maxsize=0)
fifo即first in first out,先進先出。queue提供了一個基本的fifo容器,使用方法很簡單,maxsize是個整數,指明了隊列中能存放的數據個數的上限。一旦達到上限,插入會導致阻塞,直到隊列中的數據被消費掉。如果maxsize小于或者等于0,隊列大小沒有限制。
舉個栗子:
1
2
3
4
5
6
7
8
9
|
import queue q = queue.queue() for i in range ( 5 ): q.put(i) while not q.empty(): print q.get() |
輸出:
0
1
2
3
4
lifo隊列
class queue.lifoqueue(maxsize=0)
lifo即last in first out,后進先出。與棧的類似,使用也很簡單,maxsize用法同上
再舉個栗子:
1
2
3
4
5
6
7
8
9
|
import queue q = queue.lifoqueue() for i in range ( 5 ): q.put(i) while not q.empty(): print q.get() |
輸出:
4
3
2
1
0
可以看到僅僅是將queue.quenu類替換為queue.lifiqueue類
優先級隊列
class queue.priorityqueue(maxsize=0)
構造一個優先隊列。maxsize用法同上。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import queue import threading class job( object ): def __init__( self , priority, description): self .priority = priority self .description = description print 'job:' ,description return def __cmp__( self , other): return cmp ( self .priority, other.priority) q = queue.priorityqueue() q.put(job( 3 , 'level 3 job' )) q.put(job( 10 , 'level 10 job' )) q.put(job( 1 , 'level 1 job' )) def process_job(q): while true: next_job = q.get() print 'for:' , next_job.description q.task_done() workers = [threading.thread(target = process_job, args = (q,)), threading.thread(target = process_job, args = (q,)) ] for w in workers: w.setdaemon(true) w.start() q.join() |
結果
job: level 3 job
job: level 10 job
job: level 1 job
for: level 1 job
for: level 3 job
for: job: level 10 job
一些常用方法
task_done()
意味著之前入隊的一個任務已經完成。由隊列的消費者線程調用。每一個get()調用得到一個任務,接下來的task_done()調用告訴隊列該任務已經處理完畢。
如果當前一個join()正在阻塞,它將在隊列中的所有任務都處理完時恢復執行(即每一個由put()調用入隊的任務都有一個對應的task_done()調用)。
join()
阻塞調用線程,直到隊列中的所有任務被處理掉。
只要有數據被加入隊列,未完成的任務數就會增加。當消費者線程調用task_done()(意味著有消費者取得任務并完成任務),未完成的任務數就會減少。當未完成的任務數降到0,join()解除阻塞。
put(item[, block[, timeout]])
將item放入隊列中。
- 如果可選的參數block為true且timeout為空對象(默認的情況,阻塞調用,無超時)。
- 如果timeout是個正整數,阻塞調用進程最多timeout秒,如果一直無空空間可用,拋出full異常(帶超時的阻塞調用)。
- 如果block為false,如果有空閑空間可用將數據放入隊列,否則立即拋出full異常
- 其非阻塞版本為put_nowait等同于put(item, false)
get([block[, timeout]])
從隊列中移除并返回一個數據。block跟timeout參數同put方法
其非阻塞方法為`get_nowait()`相當與get(false)
empty()
如果隊列為空,返回true,反之返回false
以上所述是小編給大家介紹的python隊列queue詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:https://www.cnblogs.com/itogo/p/5635629.html