1. 程式人生 > >消息隊列queue

消息隊列queue

線程編程 log code ack stdin class 需要 ref cal

一、queue

在多線程編程中,程序的解耦往往是一個麻煩的問題,以及在socket網絡編程中也會有這樣的問題。recv 和send之間,如果服務端有消息,問題需要發送給客戶端,而那邊的recv 被主程序占用,而使用多線程加 隊列queue,我們就可以把消息發送到queue,而不用管對方怎麽處理是否處理,同樣對於服務端。

  • 消息隊列queue在多線程編程中是一個非常好用的模塊。
1.1 幾種不同的queue

先進先出:q1 = queue.Queue(maxsize= 0) # first in first out
先進後出: q2 = queue.FifoQueue(maxsize= 0) # last in first out

優先級隊列: q3 = queue.PriorityQueue(maxsize= 0) #放入元組數據,第一個參數越小優先級越高

  • 隊列的幾種常用方法
  1. q.put(item, block= True, timeout= 0) #第一個參數為數據,第二個為是否阻塞,如隊列滿了,就阻塞住程序,不讓放進去, 第三超時時間
  2. q.get(block= True, timeout= 0) #同理put, 隊列為空阻塞,如果block為False就不阻塞。

  3. q.qsize() 查看當前隊列長度,如當q.qsize()>0 時,你就去q.get()
  4. q.empty() 如果當前隊列為空則返回True,也可用來檢查隊列中是否有任務等場景
  5. q.full() 同上隊列滿了返回True

>>> import queue
>>> q= queue.Queue(10)
>>> q.put(1)
>>> q.put(2)
>>> q.qsize()
2
>>> q.empty()
False
>>> q.full()
False
>>> q.get(block=False)
1
>>> q.get(block=False)
2
>>> q.get(block=False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "E:\python35\lib\queue.py", line 161, in get
    raise Empty
queue.Empty

消息隊列實現生產者消費者模型

消息隊列queue