请稍候,加载中....

线程间队列通信模块queue

queue模块可以创建先进先出fifo队列,后进先出lifo队列,优先priority队列

queue模块队列对象

类名 说明
Queue(maxsize=0) 创建先进先出队列,maxsize=0为无限队列,可以指定maxsize一个值,如果队列长度达到maxsize,那么将会阻塞,直到队列长度小于maxsize
LifoQueue(maxsize=0) 创建后进先出队列
PriorityQueue(maxsize=0) 创建优先队列

队列对象方法

从队列中获取一个元素,如果block为True,则会阻塞到有可用item为止,如果设定了timeout值,则会最多阻塞timeout秒

方法名 说明
qsize() 返回队列大小,由于队列会被其他线程修改,所以该值为近似值
empty() 如果队列为空,返回True,否则返回False
full() 如果队列满,返回True,否则返回False
put(item, block=True, timeout=None) 将item放入队列,如果block为True,且timeout为None,则在有空间之前阻塞,如果timeout设定了值,则在阻塞时间为timeout秒,如果block=False,则会抛出Empty异常
put_nowait(item) 相当于put(item, block=False)
get(block=True, timeout=None) 从队列中获取一个item,如果block为True,当队列为空时,将一直阻塞到队列可用,如果timeout被指定,将阻塞timeout秒,然后抛出Empty错误
get_nowait() 相当于get(Flase)
task_done() 用于表示队列中的某个元素已执行完毕,该方法会被下面的join()使用
join() 在队列中所有元素执行完毕并在调用task_done()信号之前,保持阻塞

队列异常

异常 说明
Empty 对空队列调用get()时抛出
Full 对已满队列调用put()时抛出

生产者与消费者

在队列的使用中,线程角色通常分为生产者与消费者两种角色,生产者负责向队列写入元素,消费者从队列中get元素

队列举例

from threading import Thread
from queue import Queue
from random import randint
from time import sleep

def writeQ(queue):
    print("插入队列...")
    queue.put('x', 1)
    print("队列长度",queue.qsize())

def readQ(queue):
    print("从队列中读取...")
    val = queue.get(1)
    print("队列长度",queue.qsize())
   
def writer(queue, loops):
    for i in range(loops):
        writeQ(queue)
        sleep(randint(1,3))

def reader(queue, loops):
    for i in range(loops):
        readQ(queue)
        sleep(randint(2,5))

if __name__ == "__main__":    
    nloops = randint(2,5)
    q = Queue()
    threads = []
    t = Thread(target=writer, args=(q, nloops))
    t.start()
    t = Thread(target=reader, args=(q,nloops))
    t.start()

输出
插入队列...
队列长度 1
从队列中读取...

队列长度 0
插入队列...
队列长度 1
从队列中读取...
队列长度 0
插入队列...
队列长度 1
从队列中读取...
队列长度 0

Python学习手册-