1. 程式人生 > >Queue 實現生產者消費者模型

Queue 實現生產者消費者模型

pri join() imp 等待 tar 構造函數 nowait import 長度

Python中,隊列是線程間最常用的交換數據的形式。

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)
非阻塞 q.put(item) 寫入隊列,timeout等待時間
q.put_nowait(item) 相當q.put(item, False)
q.task_done() 在完成一項工作之後,q.task_done() 函數向任務已經完成的隊列發送一個信號
q.join() 實際上意味著等到隊列為空,再執行別的操作

# coding=utf-8

import Queue
import threading
import time


q = Queue.Queue(maxsize=10)  # 創建一個隊列對象,長度限制為10,maxsize小於1就代表無限制


def producer(name):
    count = 1
    while True:
        q.put(count)  # 將值放入隊列中 默認block為True,無數據時調用線程暫停,否則拋出異常
        print "%s 生產了包子 %d" % (name, count)
        count += 1
        time.sleep(
0.5) def consumer(name): while True: conut_con = q.get() # 從隊列中取值 默認block為True,無數據時調用線程暫停,否則拋出異常 print "%s 吃掉了包子 %d" % (name, conut_con) time.sleep(2) pro = threading.Thread(target=producer, args=("德源",)) con = threading.Thread(target=consumer, args=("xu",)) con2 = threading.Thread(target=consumer, args=("
sx",)) pro.start() con.start() con2.start() # 開啟線程

Queue 實現生產者消費者模型