python queue模塊實例解析

一 概念:
隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,是一種操作受限制的線性表。
進行插入操作的端稱爲隊尾,進行刪除操作的端稱爲隊頭,核心概念是先進先出。
  • Queue.qsize() 返回隊列的大小
  • Queue.empty() 如果隊列爲空,返回True,反之False
  • Queue.full() 如果隊列滿了,返回True,反之False,Queue.full 與 maxsize 大小對應
  • Queue.get([block[, timeout]])獲取隊列,timeout等待時間
  • Queue.get_nowait() 相當於Queue.get(False),非阻塞方法
  • Queue.put(item) 寫入隊列,timeout等待時間
  • Queue.task_done() 在完成一項工作之後,Queue.task_done()函數向任務已經完成的隊列發送一個信號。每個get()調用得到一個任務,接下來task_done()調用告訴隊列該任務已經處理完畢。
  • Queue.join() 實際上意味着等到隊列爲空,再執行別的操作
 
二 實例解析
代碼
import threading
import queue
import time

# 創建隊列,用於存儲數據
q = queue.Queue()
icnt = 0
def producer():
    while True:
        global icnt
        icnt = icnt + 1
        #print("producer icnt is:%d "%icnt)
        data = "hello world"
        print("producer is:",icnt)
        q.put(data) # 生產者線程函數,向隊列存入數據
        q.join()
        data = "hello queue aaa "
        print("producer is:aaa ",icnt)
        q.put(data) # 生產者線程函數,向隊列存入數據
        q.join()
        time.sleep(1)

def consumer():
    while True:
        data = q.get() # 消費者線程,從隊列取出數據
        q.task_done()
        print("consumer is:",data)


# 創建並啓動生產者、消費者線程
t1 = threading.Thread(target=producer)
t2 = threading.Thread(target=consumer)
t1.start()
t2.start()

# 等待線程結束

t1.join()
t2.join()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章