天天看点

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()