天天看點

python爬蟲之Queue隊列

Queue隊列類型

FIFO

FIFO即First in First Out,先進先出。Queue提供了一個基本的FIFO容器,使用方法很簡單,maxsize是個整數,指明了隊列中能存放的資料個數的上限。一旦達到上限,插入會導緻阻塞,直到隊列中的資料被消費掉。如果maxsize小于或者等于0,隊列大小沒有限制。

LIFO

LIFO即Last in First Out,後進先出。與棧的類似,使用也很簡單,maxsize用法同上

priority

構造一個優先隊列。maxsize用法同上

使用方法

方法 描述
Queue.qsize() 傳回隊列大小
Queue.empty() 判斷隊列是否為空
Queue.full() 判斷隊列是否滿了
Queue.get([block[,timeout]]) 從隊列頭删除并傳回一個item,block預設為True,表示當隊列為空卻去get的時候會阻塞線程,等待直到有有item出現為止來get出這個item。如果是False的話表明當隊列為空你卻去get的時候,會引發異常。在block為True的情況下可以再設定timeout參數。表示當隊列為空,get阻塞timeout指定的秒數之後還沒有get到的話就引發Full異常。
Queue.put(…[,block[,timeout]]) 向隊尾插入一個item,同樣若block=True的話隊列滿時就阻塞等待有空位出來再put,block=False時引發異常。同get的timeout,put的timeout是在block為True的時候進行逾時設定的參數。
Queue.task_done() 從場景上來說,處理完一個get出來的item之後,調用task_done将向隊列發出一個信号,表示本任務已經完成。
Queue.join() 監視所有item并阻塞主線程,直到所有item都調用了task_done之後主線程才繼續向下執行。這麼做的好處在于,假如一個線程開始處理最後一個任務,它從任務隊列中拿走最後一個任務,此時任務隊列就空了但最後那個線程還沒處理完。當調用了join之後,主線程就不會因為隊列空了而擅自結束,而是等待最後那個線程處理完成了。

生産者與消費者

import threading
from queue import Queue
import time

que = Queue(5)

l =[]

class Producter(threading.Thread):

    def run(self):
        global l,que
        while True:
            try:
                v = l.pop(0)
                que.put(v)
            except IndexError:
                print("{} exit".format(threading.current_thread()))
                break

class Consumer(threading.Thread):
    def run(self):
        global que
        while True:
            if que.not_empty:
                v = que.get()
                time.sleep(0.5)
                que.task_done()
                print("{} begining {}".format(threading.current_thread(),v))
            else:
                print("{} exit".format(threading.current_thread()))
                break


def main():
    global que
    p = Producter(name="生産者1")
    p.setDaemon(True)
    p.start()

    for i in range(3):
        c = Consumer(name="消費者{}".format(i))
        c.setDaemon(True)# 設定為守護程序,主線程退出時,子程序也kill掉
        c.start()
    que.join()

if __name__ == '__main__':

    for i in range(20):
        l.append("music {}".format(i))
    main()