赞
踩
Queue类:是 Python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构----队列,用于生产者和消费者线程之间的信息传递。队列是线程间最常用的交换数据的形式。这里有个问题,为什么使用队列( Queue),不使用 Python原生的列表(List)或字典(Dict)类型呢?原因是List,Dict等数据存储类型都是非线程安全的。在多线程中,为了防止共享资源的数据不同步问题,对资源加锁是个重要的环节。 Queue类中实现了所有的锁逻辑,能够满足多线程的需求,所以在满足使用条件的情况下,建议使用队列。 Queue类提供了数据存储和管理的常用方法,如下所示:
1. queue.Queue(maxsize) ♥ 用于创建队列, maxsize规定了队列的长度。一旦达到上限,再添加数据会导致阻塞,直到队列中的数据被消费掉。如果maxsize小于或者等于0,表示队列大小没有限制。 maxsize的默认值为0。 2. empty() ♥ 如果队列为空,返回True,否则返回Fals 3. full() ♥ 如果队列已满则返回True,否则返回Fals 4. qsize() ♥ 返回队列的大小。 5. get(block=True, timeout=None) ♥ 从队头获取并删除第一个元素。它有两个可选参数: block:默认为True,即当队列为空时,阻塞当前线程。当为 False时,表示当队列为空时,不阻塞线程,而是抛出 Empty异常。 timeout:设置阻塞的最大时长,默认为None。 ♥ 当bock为True时, timeout为None,则表示无限期阻塞线程,直到队列里有一个可用元素; ♥ timeout为正数,表示阻塞的最大等待时长,如果超出时长队列里还没有元素,则抛出 Empty异常。 ♥ 当 block为 False时,忽略 timeout参数 6.put(item, block=True, timeout=None) ♥ 在队尾添加一个元素。put有三个参数,依次介绍如下: item:必需的参数,表示添加元素的值 block:可选参数,默认值为True,表示当队列已满时阻塞当前线程。如果取值为 False,则当列已满时抛出Full异常 timeout:可选参数,默认为None。 ♥ 当bock参数值为True时, timeout表示阻塞的时长,如果 timeout为None,表示无限期阻塞线程,直到队列里空出一个数据单元:如果 timeout为正数,则表示阻塞的最大等待时长,如果超出最大时长还没有可用数据单元出现,则引发Full异常。 ♥ 如果 block参数为 False,则忽略 timeout参数 7.get_nowait() ♥立即取出一个元素,不等待,相当于get( False) 8. put_nowait() ♥ 立即放入一个元素,不等待,相当于put(item,False) 9. task_done() ♥ 在完成一项工作之后, task_done0函数向任务已经完成的队列发送一个信号 10.join() ♥ 阻塞当前线程,直到队列里的所有元素都已被处理
from queue import Queue # Queue:先进先出队列,类似火车站排队 # 创建Queue对象 # maxsize 用于指定Queue队列的容量,最多可以放多少元素,不指定则没有限制 q = Queue(maxsize=3) # 存储元素 q.put(1) q.put(2) q.put(3) # 该方法存储数据,若队列满了,put方法会一直阻塞,知道队列不满为止 # q.put('34') # 向队列中存储元素,若队列满了,直接报错:queue.Full # q.put_nowait('45') # qsize队列中元素个数 print(q.qsize()) # 3 # 判断队列是否满了 print(q.full()) # True # 取出数据 # print(q.get()) # 1 # print(q.get()) # 2 # get_nowait() , 获取元素,不等待,如果队列空,直接报错:queue.Empty # print(q.get_nowait()) # 判断队列是否空了 print(q.empty()) # Flase # 没有完成的任务数 # 每添加一个元素,都会让unfinished_tasks增加1 # 但是每获取一个元素,并不会让unfinished_tasks减少1 # 只有调用q.task_done() 方法,才会减少1 print(q.unfinished_tasks) # 3 q.task_done() print(q.unfinished_tasks) # 2 # join()方法:让主线程等待,直到unfinished_tasks为0的时候为止 q.join()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。