当前位置:   article > 正文

Queue类

Queue类

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()
	♥ 阻塞当前线程,直到队列里的所有元素都已被处理
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/968487
推荐阅读
相关标签
  

闽ICP备14008679号