python queue windows_python Queue模块
創(chuàng)建一個“隊列”對象
import Queue
myqueue = Queue.Queue(maxsize = 10)
Queue.Queue類即是一個隊列的同步實現(xiàn)。隊列長度可為無限或者有限。可通過Queue的構(gòu)造函數(shù)的可選參數(shù)maxsize來設(shè)定隊列長度。如果maxsize小于1就表示隊列長度無限。
將一個值放入隊列中
myqueue.put(10)
調(diào)用隊列對象的put()方法在隊尾插入一個項目。put()有兩個參數(shù),第一個item為必需的,為插入項目的值;第二個block為可選參數(shù),默認(rèn)為1。如果隊列當(dāng)前為空且block為1,put()方法就使調(diào)用線程暫停,直到空出一個數(shù)據(jù)單元。如果block為0,put方法將引發(fā)Full異常。
將一個值從隊列中取出
myqueue.get()
調(diào)用隊列對象的get()方法從隊頭刪除并返回一個項目。可選參數(shù)為block,默認(rèn)為True。如果隊列為空且block為True,get()就使調(diào)用線程暫停,直至有項目可用。如果隊列為空且block為False,隊列將引發(fā)Empty異常。
python queue模塊有三種隊列:
1、python queue模塊的FIFO隊列先進(jìn)先出。
2、LIFO類似于堆。即先進(jìn)后出。
3、還有一種是優(yōu)先級隊列級別越低越先出來。
針對這三種隊列分別有三個構(gòu)造函數(shù):
1、class Queue.Queue(maxsize) FIFO
2、class Queue.LifoQueue(maxsize) LIFO
3、class Queue.PriorityQueue(maxsize) 優(yōu)先級隊列
介紹一下此包中的常用方法:
Queue.qsize() 返回隊列的大小
Queue.empty() 如果隊列為空,返回True,反之False
Queue.full() 如果隊列滿了,返回True,反之False
Queue.full 與 maxsize 大小對應(yīng)
Queue.get([block[, timeout]])獲取隊列,timeout等待時間
Queue.get_nowait() 相當(dāng)Queue.get(False)
非阻塞 Queue.put(item) 寫入隊列,timeout等待時間
Queue.put_nowait(item) 相當(dāng)Queue.put(item, False)
Queue.task_done() 在完成一項工作之后,Queue.task_done()函數(shù)向任務(wù)已經(jīng)完成的隊列發(fā)送一個信號
Queue.join() 實際上意味著等到隊列為空,再執(zhí)行別的操作
附上一個例子:
#coding:utf-8
import Queue
import threading
import time
import random
q = Queue.Queue(0) #當(dāng)有多個線程共享一個東西的時候就可以用它了
NUM_WORKERS = 3
class MyThread(threading.Thread):
def __init__(self,input,worktype):
self._jobq = input
self._work_type = worktype
threading.Thread.__init__(self)
def run(self):
while True:
if self._jobq.qsize() > 0:
self._process_job(self._jobq.get(),self._work_type)
else:break
def _process_job(self, job, worktype):
doJob(job,worktype)
def doJob(job, worktype):
time.sleep(random.random() * 3)
print"doing",job," worktype ",worktype
if __name__ == '__main__':
print "begin...."
for i inrange(NUM_WORKERS * 2):
q.put(i) #放入到任務(wù)隊列中去
print "job qsize:",q.qsize()
for x inrange(NUM_WORKERS):
MyThread(q,x).start()一些需要注意的地方:
1. 阻塞模式
importQueue
q = Queue.Queue(10)
......
fori in range(10):
q.put('A')
time.sleep(0.5)
這是一段極其簡單的代碼(另有兩個線程也在操作隊列q),我期望每隔0.5秒寫一個'A'到隊列中,但總是不能如愿:間隔時間有時會遠(yuǎn)遠(yuǎn)超過0.5秒。原來,Queue.put()默認(rèn)有 block = True 和 timeou 兩個參數(shù)。當(dāng)? block = True 時,寫入是阻塞式的,阻塞時間由 timeou? 確定。當(dāng)隊列q被(其他線程)寫滿后,這段代碼就會阻塞,直至其他線程取走數(shù)據(jù)。Queue.put()方法加上 block=False 的參數(shù),即可解決這個隱蔽的問題。但要注意,非阻塞方式寫隊列,當(dāng)隊列滿時會拋出 exception Queue.Full 的異常。
2. 無法捕獲 exception Queue.Empty 的異常
whileTrue:
......
try:
data = q.get()
exceptQueue.Empty:
break
我的本意是用隊列為空時,退出循環(huán),但實際運行起來,卻陷入了死循環(huán)。這個問題和上面有點類似:Queue.get()默認(rèn)的也是阻塞方式讀取數(shù)據(jù),隊列為空時,不會拋出 except Queue.Empty ,而是進(jìn)入阻塞直至超時。 加上block=False 的參數(shù),問題迎刃而解。
總結(jié)
以上是生活随笔為你收集整理的python queue windows_python Queue模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的三个环境变量是啥_JAVA中常
- 下一篇: (递归)最大公约数