Python自带队列模块Queue的使用(1)

Python自带的队列模块有4种队列:

FIFO:first in first out  先进先出

LIFO:last in first out   后进先出,类似于栈的数据结构

proiority:优先队列

deque:   双端队列

这一部分,先介绍FIFO模式的队列,后三种队列会在后续的文章种介绍

设置队列长度、进队列与出队列

from queue import Queue

#如果maxsize设置为小于0或者不设置,队列为无限长
que = Queue(maxsize=2)

#进队列
que.put(1)

#出队列
result = que.get()

#result结果:1
入队列时堵塞
from queue import Queue

#设置队列长度为1
que = Queue(maxsize=1)

#此时如果入队列两次, put将会一直堵塞,等待前一个出队列
que.put(1)
que.put(2)

入队列非堵塞

from queue import Queue

que = Queue(maxsize=1)

#设置block为False为非堵塞,默认block为True堵塞
try:
    que.put(1)
    #如果队列为满,非堵塞将会报异常
    que.put(2,block=False)
except Exception:
    pass

出队列堵塞

from queue import Queue

que = Queue(maxsize=2)

que.put(1)

que.get()
que.get()
#如果队列为空,get会一直等待

出队列非堵塞

from queue import Queue

que = Queue(maxsize=2)

que.put(1)

que.get()
try:
    #如果设置为非堵塞,将会报异常
    que.get(block=False)
except Exception:
    pass

设置超时

from queue import Queue

que = Queue(maxsize=1)

que.put(1)
try:
    #设置超时后,如果2秒后还不能进队列将会报异常
    #在非堵塞的情况下,无需设置超时
    que.put(2,timeout=2)
except Exception:
    pass

que.get()
try:
    #设置超时后,如果2秒后队列仍是空将会报异常
    #在非堵塞的情况下,无需设置超时
    que.get(timeout=2)
except Exception:
    pass

队列中还有两个方法put_nowait和get_nowait,这两个方法相对于put(item,block=False),get(block=False)

join( )与task_done( )的关系,在多线程中,队列设置join后,将会一直等待队列为空才会结束,而task_done就是告诉join何时结束,但是如果队列仍有数据,就算写了task_done程序依然会一直堵塞,这是一个对队列的保护措施。

from queue import Queue
from threading import Thread
import time
que = Queue()


def task(value):
    global que
    que.put(value)
    # que.put(value)

def task2():
    global que
    res = que.get()
    print(res)
    que.task_done()

t1 = Thread(target=task, args=(10,))
t2 = Thread(target=task2)
t1.start()
t2.start()
t1.join()
t2.join()

que.join()

下面还有几个基本的操作:

que.empty()     判断队列是否为空,如果为空返回True,反之返回False

que.full()          判断队列是否为满,如果为满返回True,反之返回False

que.qsize()      返回当前队列有多少成员

que.maxsize    返回队列的最大长度

猜你喜欢

转载自blog.csdn.net/qq_38949193/article/details/81229048