python queue模块_Python的queue模块详解
Queue
Queue是python標(biāo)準(zhǔn)庫中的線程安全的隊(duì)列(FIFO)實(shí)現(xiàn),提供了一個適用于多線程編程的先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),即隊(duì)列,用來在生產(chǎn)者和消費(fèi)者線程之間的信息傳遞
基本FIFO隊(duì)列
class Queue.Queue(maxsize=0)
FIFO即First in First Out,先進(jìn)先出。Queue提供了一個基本的FIFO容器,使用方法很簡單,maxsize是個整數(shù),指明了隊(duì)列中能存放的數(shù)據(jù)個數(shù)的上限。一旦達(dá)到上限,插入會導(dǎo)致阻塞,直到隊(duì)列中的數(shù)據(jù)被消費(fèi)掉。如果maxsize小于或者等于0,隊(duì)列大小沒有限制。
舉個栗子:
1 import Queue2 3 q = Queue.Queue()4 5 for i in range(5):6 q.put(i)7 8 while not q.empty():9 print q.get()
輸出:
01
2
3
4
LIFO隊(duì)列
class Queue.LifoQueue(maxsize=0)
LIFO即Last in First Out,后進(jìn)先出。與棧的類似,使用也很簡單,maxsize用法同上
再舉個栗子:
1 import Queue2 3 q = Queue.LifoQueue()4 5 for i in range(5):6 q.put(i)7 8 while not q.empty():9 print q.get()
輸出:
4
3
2
10
可以看到僅僅是將Queue.Quenu類替換為Queue.LifiQueue類
優(yōu)先級隊(duì)列
class Queue.PriorityQueue(maxsize=0)
構(gòu)造一個優(yōu)先隊(duì)列。maxsize用法同上。
import Queueimport threadingclass Job(object):def __init__(self, priority, description):
self.priority = priority
self.description = descriptionprint 'Job:',descriptionreturndef __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()
結(jié)果
Job: level 3 job
Job: level 10 job
Job: level 1 jobfor: level 1 jobfor: level 3 jobfor: job: level 10 job
一些常用方法
task_done()
意味著之前入隊(duì)的一個任務(wù)已經(jīng)完成。由隊(duì)列的消費(fèi)者線程調(diào)用。每一個get()調(diào)用得到一個任務(wù),接下來的task_done()調(diào)用告訴隊(duì)列該任務(wù)已經(jīng)處理完畢。
如果當(dāng)前一個join()正在阻塞,它將在隊(duì)列中的所有任務(wù)都處理完時恢復(fù)執(zhí)行(即每一個由put()調(diào)用入隊(duì)的任務(wù)都有一個對應(yīng)的task_done()調(diào)用)。
join()
阻塞調(diào)用線程,直到隊(duì)列中的所有任務(wù)被處理掉。
只要有數(shù)據(jù)被加入隊(duì)列,未完成的任務(wù)數(shù)就會增加。當(dāng)消費(fèi)者線程調(diào)用task_done()(意味著有消費(fèi)者取得任務(wù)并完成任務(wù)),未完成的任務(wù)數(shù)就會減少。當(dāng)未完成的任務(wù)數(shù)降到0,join()解除阻塞。
put(item[, block[, timeout]])
將item放入隊(duì)列中。如果可選的參數(shù)block為True且timeout為空對象(默認(rèn)的情況,阻塞調(diào)用,無超時)。
如果timeout是個正整數(shù),阻塞調(diào)用進(jìn)程最多timeout秒,如果一直無空空間可用,拋出Full異常(帶超時的阻塞調(diào)用)。
如果block為False,如果有空閑空間可用將數(shù)據(jù)放入隊(duì)列,否則立即拋出Full異常
其非阻塞版本為put_nowait等同于put(item, False)
get([block[, timeout]])
從隊(duì)列中移除并返回一個數(shù)據(jù)。block跟timeout參數(shù)同put方法
其非阻塞方法為`get_nowait()`相當(dāng)與get(False)
empty()
如果隊(duì)列為空,返回True,反之返回False
總結(jié)
以上是生活随笔為你收集整理的python queue模块_Python的queue模块详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ueditor 不显示工具栏_Pytho
- 下一篇: 编写五子棋程序时如何添加下棋时的音效_干