Source From Here
Preface
Python中,佇列 (First In First Out) 是線程間最常用的交換數據的形式。Queue 模塊 是提供佇列操作的模塊,雖然簡單易用,但是不小心的話,還是會出現一些意外。
創建一個 “佇列” 對象
Queue.Queue 類即是一個佇列的同步實現。佇列長度可為無限或者有限。可通過 Queue 的構造函數的可選參數 maxsize 來設定隊列長度。如果 maxsize 小於 1 就表示隊列長度無限。
將一個值放入隊列中
調用佇列對象的
put() 方法在隊尾插入一個項目。put() 有兩個參數,第一個 item 為必需的,為插入項目的值;第二個 block 參數與第三個參數 timeout 為可選參數:
將一個值從隊列中取出
調用隊列對象的
get() 方法從隊頭刪除並返回一個項目。可選參數為 block,默認為True。如果隊列為空且 block 為True,get() 就使調用線程暫停,直至有項目可用 (此時 timeout 參數為 None)。如果隊列為空且 block 為False,隊列將引發 Empty 異常。詳細說明如下:
Python Queue 模塊有三種佇列及構造函數:
1. Python Queue 模塊的 FIFO 佇列先進先出。class Queue.Queue(maxsize)
2、LIFO 類似於堆疊,即先進後出。class Queue.LifoQueue(maxsize)
3、還有一種是優先級隊列級別越低越先出來。class Queue.PriorityQueue(maxsize)
此套件中的常用方法 (q = Queue.Queue( )):
* q.qsize(): 返回隊列的大小
* q.empty():如果隊列為空,返回 True, 反之 False
* q.full(): 如果隊列滿了,返回 True,反之 False
* q.full 與 maxsize 大小對應
* q.get([block[, timeout]]): 獲取隊列,timeout 等待時間
* q.get_nowait(): 相當 q.get(False)
* put(item[, block[, timeout]]): 取出置入項目
* q.put_nowait(item): 相當 q.put(item, False)
* q.task_done(): 在完成一項工作之後,q.task_done() 函數向任務已經完成的隊列發送一個信號
* q .join(): 實際上意味著等到佇列為空,再執行別的操作
範例:
* 實現一個線程不斷生成一個隨機數到一個隊列中 (考慮使用 Queue 這個模塊)
* 實現一個線程從上面的隊列裡面不斷的取出奇數
* 實現另外一個線程從上面的隊列裡面不斷取出偶數
- Demo.py
One example output:
Preface
Python中,佇列 (First In First Out) 是線程間最常用的交換數據的形式。Queue 模塊 是提供佇列操作的模塊,雖然簡單易用,但是不小心的話,還是會出現一些意外。
創建一個 “佇列” 對象
- import Queue
- q = Queue.Queue(maxsize = 10)
將一個值放入隊列中
- // Queue.put(item[, block[, timeout]])
- q.put(10)
將一個值從隊列中取出
- // Queue.get([block[, timeout]])
- q.get()
Python Queue 模塊有三種佇列及構造函數:
1. Python Queue 模塊的 FIFO 佇列先進先出。class Queue.Queue(maxsize)
2、LIFO 類似於堆疊,即先進後出。class Queue.LifoQueue(maxsize)
3、還有一種是優先級隊列級別越低越先出來。class Queue.PriorityQueue(maxsize)
此套件中的常用方法 (q = Queue.Queue( )):
* q.qsize(): 返回隊列的大小
* q.empty():如果隊列為空,返回 True, 反之 False
* q.full(): 如果隊列滿了,返回 True,反之 False
* q.full 與 maxsize 大小對應
* q.get([block[, timeout]]): 獲取隊列,timeout 等待時間
* q.get_nowait(): 相當 q.get(False)
* put(item[, block[, timeout]]): 取出置入項目
* q.put_nowait(item): 相當 q.put(item, False)
* q.task_done(): 在完成一項工作之後,q.task_done() 函數向任務已經完成的隊列發送一個信號
* q .join(): 實際上意味著等到佇列為空,再執行別的操作
範例:
* 實現一個線程不斷生成一個隨機數到一個隊列中 (考慮使用 Queue 這個模塊)
* 實現一個線程從上面的隊列裡面不斷的取出奇數
* 實現另外一個線程從上面的隊列裡面不斷取出偶數
- Demo.py
- #!/usr/bin/env python
- #coding:utf8
- import random,threading,time
- from Queue import Queue
- #Producer thread
- class Producer(threading.Thread):
- def __init__(self, t_name, queue):
- threading.Thread.__init__(self,name=t_name)
- self.data=queue
- def run(self):
- for i in range(10): # Randomly generte 10 numbers
- randomnum=random.randint(1, 99)
- print "%s: %s is producing %d to the queue!" % (time.ctime(), self.getName(), randomnum)
- self.data.put(randomnum) # Put the generated number into queue
- time.sleep(1)
- print "%s: %s finished!" %(time.ctime(), self.getName())
- #Consumer thread
- class Consumer_even(threading.Thread):
- def __init__(self,t_name,queue):
- threading.Thread.__init__(self,name=t_name)
- self.data=queue
- def run(self):
- while 1:
- try:
- val_even = self.data.get(True, 5) # get(self, block=True, timeout=None), Block at most 5 seconds
- if val_even%2==0:
- print "%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(),self.getName(),val_even)
- time.sleep(2)
- else:
- self.data.put(val_even)
- time.sleep(2)
- except: # Wait for input and throw excetion when timeout
- print "%s: %s finished!" %(time.ctime(),self.getName())
- break
- class Consumer_odd(threading.Thread):
- def __init__(self,t_name,queue):
- threading.Thread.__init__(self, name=t_name)
- self.data=queue
- def run(self):
- while 1:
- try:
- val_odd = self.data.get(1,5)
- if val_odd%2!=0:
- print "%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(), self.getName(), val_odd)
- time.sleep(2)
- else:
- self.data.put(val_odd)
- time.sleep(2)
- except:
- print "%s: %s finished!" % (time.ctime(), self.getName())
- break
- #Main thread
- def main():
- queue = Queue()
- producer = Producer('Pro.', queue)
- consumer_even = Consumer_even('Con_even.', queue)
- consumer_odd = Consumer_odd('Con_odd.',queue)
- producer.start()
- consumer_even.start()
- consumer_odd.start()
- producer.join()
- consumer_even.join()
- consumer_odd.join()
- print 'All threads terminate!'
- if __name__ == '__main__':
- main()
沒有留言:
張貼留言