1. 程式人生 > >Python -- queue佇列模組

Python -- queue佇列模組

一 簡單使用 --內建模組哦

import Queue
myqueue = Queue.Queue(maxsize = 10)
  Queue.Queue類即是一個佇列的同步實現。佇列長度可為無限或者有限。可通過Queue的建構函式的可選引數maxsize來設定佇列長度。如果maxsize小於1就表示佇列長度無限。
將一個值放入佇列中
myqueue.put(10)
    呼叫佇列物件的put()方法在隊尾插入一個專案。put()有兩個引數,第一個item為必需的,為插入專案的值;第二個block為可選引數,預設為1。如果隊列當前為空且block為1,put()方法就使呼叫執行緒暫停,直到空出一個數據單元。如果block為0,put方法將引發Full異常。

將一個值從佇列中取出
myqueue.get()

呼叫佇列物件的get()方法從隊頭刪除並返回一個專案。可選引數為block,預設為True。如果佇列為空且block為True,get()就使呼叫執行緒暫停,直至有專案可用。如果佇列為空且block為False,佇列將引發Empty異常。


python queue模組有三種佇列:


1、python queue模組的FIFO佇列先進先出。
2、LIFO類似於堆。即先進後出。
3、還有一種是優先順序佇列級別越低越先出來。 

針對這三種佇列分別有三個建構函式:
1、class Queue.Queue(maxsize) FIFO 
2、class Queue.LifoQueue(maxsize) LIFO 
3、class Queue.PriorityQueue(maxsize) 優先順序佇列 

介紹一下此包中的常用方法:

 二、API介紹

該模組包含以下函式:

1.Queue.qsize()

該函式返回訊息佇列的當前空間。

2.Queue.empty()

該函式判斷訊息佇列是否為空,返回True或False。

3.Queue.full()

該函式判斷訊息佇列是否滿,返回True或False。 Queue.full 與 maxsize 大小對應 

4.Queue.put(item, block=True, timeout=None)

該函式用來訊息佇列中存放訊息。block引數可以控制是否阻塞,timeout指定阻塞的等待時間。如果不阻塞或者超時,會引起一個full exception。

5.Queue.put_nowait(item)

該函式相當於put(item, False)。

6.Queue.get(block=True, timeout=None) 

該函式用於獲取訊息,其他同put相同。 Queue.get_nowait() 相當Queue.get(False)

7.Queue.task_done()

該函式接受訊息的執行緒通過呼叫這個函式來說明訊息對應的任務已完成。

8.Queue.join()

該函式呼叫執行緒阻塞直到所有訊息對應的任務已經完成。

 

複製程式碼
 1 import Queue  
 2 import threading  
 3 import time  
 4 import random  
 5   
 6 q = Queue.Queue(0) #當有多個執行緒共享一個東西的時候就可以用它了  
 7 NUM_WORKERS = 3  
 8   
 9 class MyThread(threading.Thread):  
10   
11     def __init__(self,input,worktype):  
12        self._jobq = input  
13        self._work_type = worktype  
14        threading.Thread.__init__(self)  
15   
16     def run(self):  
17        while True:  
18            if self._jobq.qsize() > 0:  
19                self._process_job(self._jobq.get(),self._work_type)  
20            else:break  
21   
22     def _process_job(self, job, worktype):  
23        doJob(job,worktype)  
24   
25 def doJob(job, worktype):  
26    time.sleep(random.random() * 3)  
27     print"doing",job," worktype ",worktype  
28   
29 if __name__ == '__main__':  
30     print "begin...."  
31     for i inrange(NUM_WORKERS * 2):  
32        q.put(i) #放入到任務佇列中去  
33     print "job qsize:",q.qsize()  
34   
35     for x inrange(NUM_WORKERS):  
36        MyThread(q,x).start()  
複製程式碼

一些需要注意的地方:

1. 阻塞模式

import Queue

q = Queue.Queue(10)

......
       for i in range(10):
               q.put('A')
               time.sleep(0.5)

這是一段極其簡單的程式碼(另有兩個執行緒也在操作佇列q),我期望每隔0.5秒寫一個'A'到佇列中,但總是不能如願:間隔時間有時會遠遠超過0.5秒。原來,Queue.put()預設有 block = True 和 timeou 兩個引數。當  block = True 時,寫入是阻塞式的,阻塞時間由 timeou  確定。當佇列q被(其他執行緒)寫滿後,這段程式碼就會阻塞,直至其他執行緒取走資料。Queue.put()方法加上 block=False 的引數,即可解決這個隱蔽的問題。但要注意,非阻塞方式寫佇列,當佇列滿時會丟擲 exception Queue.Full 的異常。

2. 無法捕獲 exception Queue.Empty 的異常

while True:
                ......
                try:
                        data = q.get()
                except Queue.Empty:
                        break

我的本意是用佇列為空時,退出迴圈,但實際執行起來,卻陷入了死迴圈。這個問題和上面有點類似:Queue.get()預設的也是阻塞方式讀取資料,佇列為空時,不會丟擲 except Queue.Empty ,而是進入阻塞直至超時。 加上block=False 的引數,問題迎刃而解。

https://www.cnblogs.com/shiluoliming/p/6428222.html

import Queue
myqueue = Queue.Queue(maxsize = 10)
  Queue.Queue類即是一個佇列的同步實現。佇列長度可為無限或者有限。可通過Queue的建構函式的可選引數maxsize來設定佇列長度。如果maxsize小於1就表示佇列長度無限。
將一個值放入佇列中
myqueue.put(10)
    呼叫佇列物件的put()方法在隊尾插入一個專案。put()有兩個引數,第一個item為必需的,為插入專案的值;第二個block為可選引數,預設為1。如果隊列當前為空且block為1,put()方法就使呼叫執行緒暫停,直到空出一個數據單元。如果block為0,put方法將引發Full異常。

將一個值從佇列中取出
myqueue.get()

呼叫佇列物件的get()方法從隊頭刪除並返回一個專案。可選引數為block,預設為True。如果佇列為空且block為True,get()就使呼叫執行緒暫停,直至有專案可用。如果佇列為空且block為False,佇列將引發Empty異常。


python queue模組有三種佇列:
1、python queue模組的FIFO佇列先進先出。
2、LIFO類似於堆。即先進後出。
3、還有一種是優先順序佇列級別越低越先出來。 

針對這三種佇列分別有三個建構函式:
1、class Queue.Queue(maxsize) FIFO 
2、class Queue.LifoQueue(maxsize) LIFO 
3、class Queue.PriorityQueue(maxsize) 優先順序佇列 

介紹一下此包中的常用方法:

 二、API介紹

該模組包含以下函式:

1.Queue.qsize()

該函式返回訊息佇列的當前空間。

2.Queue.empty()

該函式判斷訊息佇列是否為空,返回True或False。

3.Queue.full()

該函式判斷訊息佇列是否滿,返回True或False。 Queue.full 與 maxsize 大小對應 

4.Queue.put(item, block=True, timeout=None)

該函式用來訊息佇列中存放訊息。block引數可以控制是否阻塞,timeout指定阻塞的等待時間。如果不阻塞或者超時,會引起一個full exception。

5.Queue.put_nowait(item)

該函式相當於put(item, False)。

6.Queue.get(block=True, timeout=None) 

該函式用於獲取訊息,其他同put相同。 Queue.get_nowait() 相當Queue.get(False)

7.Queue.task_done()

該函式接受訊息的執行緒通過呼叫這個函式來說明訊息對應的任務已完成。

8.Queue.join()

該函式呼叫執行緒阻塞直到所有訊息對應的任務已經完成。

 

複製程式碼
 1 import Queue  
 2 import threading  
 3 import time  
 4 import random  
 5   
 6 q = Queue.Queue(0) #當有多個執行緒共享一個東西的時候就可以用它了  
 7 NUM_WORKERS = 3  
 8   
 9 class MyThread(threading.Thread):  
10   
11     def __init__(self,input,worktype):  
12        self._jobq = input  
13        self._work_type = worktype  
14        threading.Thread.__init__(self)  
15   
16     def run(self):  
17        while True:  
18            if self._jobq.qsize() > 0:  
19                self._process_job(self._jobq.get(),self._work_type)  
20            else:break  
21   
22     def _process_job(self, job, worktype):  
23        doJob(job,worktype)  
24   
25 def doJob(job, worktype):  
26    time.sleep(random.random() * 3)  
27     print"doing",job," worktype ",worktype  
28   
29 if __name__ == '__main__':  
30     print "begin...."  
31     for i inrange(NUM_WORKERS * 2):  
32        q.put(i) #放入到任務佇列中去  
33     print "job qsize:",q.qsize()  
34   
35     for x inrange(NUM_WORKERS):  
36        MyThread(q,x).start()  
複製程式碼

一些需要注意的地方:

1. 阻塞模式

import Queue

q = Queue.Queue(10)

......
       for i in range(10):
               q.put('A')
               time.sleep(0.5)

這是一段極其簡單的程式碼(另有兩個執行緒也在操作佇列q),我期望每隔0.5秒寫一個'A'到佇列中,但總是不能如願:間隔時間有時會遠遠超過0.5秒。原來,Queue.put()預設有 block = True 和 timeou 兩個引數。當  block = True 時,寫入是阻塞式的,阻塞時間由 timeou  確定。當佇列q被(其他執行緒)寫滿後,這段程式碼就會阻塞,直至其他執行緒取走資料。Queue.put()方法加上 block=False 的引數,即可解決這個隱蔽的問題。但要注意,非阻塞方式寫佇列,當佇列滿時會丟擲 exception Queue.Full 的異常。

2. 無法捕獲 exception Queue.Empty 的異常

while True:
                ......
                try:
                        data = q.get()
                except Queue.Empty:
                        break

我的本意是用佇列為空時,退出迴圈,但實際執行起來,卻陷入了死迴圈。這個問題和上面有點類似:Queue.get()預設的也是阻塞方式讀取資料,佇列為空時,不會丟擲 except Queue.Empty ,而是進入阻塞直至超時。 加上block=False 的引數,問題迎刃而解。

https://www.cnblogs.com/shiluoliming/p/6428222.html