python队列queue模块详解

Python队列(queue)模块详解

Python中队列(queue)是处理多线程中共享资源问题的一个重要工具,它遵循FIFO(先进先出)的原则,即先进入的数据先输出,而后进入的数据后输出。队列支持队列大小,以防止过度使用特定的内存资源。

Python中的队列实现为Queue模块,其中包含了三种队列类型:

  • FIFO队列(先进先出)
  • LIFO队列(后进先出),也叫做堆栈
  • 优先级队列(具有优先级顺序)

队列(queue)基本方法

以下是Queue模块中最重要的类和方法:

Queue(maxsize=0)

Queue类实现了所有基本的队列功能。maxsize是一个整数,用于设置可以放置在队列中的项目数。如果插入到队列中的项目数达到了maxsize,则插入操作将被阻塞,直到队列中的某个项目被删除,使有空间可用。

import queue

q = queue.Queue(maxsize=3)

q.put(1)
q.put(2)
q.put(3)

print(q.full())  # True

q.put(4, block=False)  # 由于队列已满,插入操作出发了queue.Full异常

while not q.empty():
    print(q.get(), end=' ')  # 输出1 2 3

LifoQueue(maxsize=0)

LifoQueue类实现了堆栈的功能。Stack类是LifoQueue的别名。它的构造方法与Queue相同,但默认的maxsize为0(无大小限制)。

import queue

lq = queue.LifoQueue(maxsize=3)

lq.put(1)
lq.put(2)
lq.put(3)

print(lq.full())  # True

lq.put(4, block=False)  # 由于堆栈已满,插入操作出发了queue.Full异常

while not lq.empty():
    print(lq.get(), end=' ')  # 输出3 2 1

PriorityQueue(maxsize=0)

PriorityQueue类实现了一个优先级队列。默认情况下,优先级值小的元素优先级高。队列中的每个元素必须是一个元组,其中第一个元素是优先级值(必须是数字类型),第二个元素是数据。

import queue

pq = queue.PriorityQueue(maxsize=3)

pq.put((1, '一'))
pq.put((2, '二'))
pq.put((3, '三'))

print(pq.full())  # True

pq.put((4, '四'), block=False)  # 由于队列已满,插入操作出发了queue.Full异常

while not pq.empty():
    print(pq.get()[1], end=' ')  # 输出一 二 三

队列(queue)其他方法

队列(Queue)数据结构还提供了许多其他方法,常用的有:

方法 描述
qsize() 返回队列的大小。当没有数量限制时,返回的值为0。
empty() 如果队列为空,返回True,否则返回False。
full() 如果队列满了,返回True,否则返回False。
get([block[, timeout]]) 获取队列中的一项。如果队列为空,block为True(默认值)则等待,直到队列中有一个项目为止。
get_nowait() 相当于get(False)。
put(item[, block[, timeout]]) 将一项添加到队列的尾部。如果队列已满,block为True(默认值)则等待。
put_nowait(item) 相当于put(item, False)。
task_done() 表示先前提交给队列的异步任务已经完成。
join() 阻塞调用线程,直到队列中的所有项目都被处理完(task_done()的调用次数等于项目的数量),才会继续运行。

总结

队列是多线程和协程编程中的重要工具,它是线程安全的,被多个线程和协程共享。Python提供了Queue模块来实现队列。Queue模块包含三种队列:FIFO、LIFO和优先级队列。队列(Queue)数据结构提供了许多方法,允许使用者控制队列的大小、检查队列状态以及添加和删除队列项目。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python队列queue模块详解 - Python技术站

(0)
上一篇 2023年6月2日
下一篇 2023年6月2日

相关文章

  • 在 Python 中动态更改列名

    【问题标题】:Changing column name dynamically in Python在 Python 中动态更改列名 【发布时间】:2023-04-01 13:25:01 【问题描述】: 我有一个包含 50 列的数据框。索引行的问题在于,所有列都命名为:未命名。 我想重命名这些列。我知道使用数据框可以这样重命名列: df.rename(colu…

    Python开发 2023年4月8日
    00
  • python 安全地删除列表元素的方法

    Python 中删除列表元素有多种方法,但有些方法可能会产生一些不可预知的结果或者安全风险。例如,使用 del 删除列表元素时,可能会意外删除某些其他变量的引用;使用 remove() 方法时,如果要删除的元素不存在,则会抛出异常。因此,为了安全地删除列表元素,可以采用以下方法: 方法一:使用 pop() 方法按索引删除元素 pop() 方法可以接收一个索引…

    python 2023年6月3日
    00
  • Python中集合类型(set)学习小结

    Python中集合类型(set)学习小结 概述 Python中的集合(set)是一种用于存储无序但唯一元素的数据类型。它基于数学中的集合概念,并且支持集合的各种数学运算。集合可以包含任何可哈希的数据类型,但集合本身是不可哈希的,而且没有顺序。 与列表和元组不同,集合没有索引,因此不能通过索引访问元素。但是,集合支持的操作范围更广,比如交集、并集、差集等等。 …

    python 2023年5月13日
    00
  • Python中list列表添加元素的3种方法总结

    在Python中,列表(list)是一种常用的数据类型,它可以存储多个元素,而且列表的长度是动态的,可以随时添加或删除元素。本文将详细讲解Python中list列表添加元素的3种方法,并提供多个示例说明。 方法一:使用append()方法向列表末尾添加元素 append()方法是Python中最常用的向列表末尾添加元素的方法,它可以接受一个参数,将其添加到列…

    python 2023年5月13日
    00
  • 完美解决Pycharm中matplotlib画图中文乱码问题

    下面是完美解决Pycharm中matplotlib画图中文乱码问题的攻略。 问题描述 当我们在Pycharm中使用matplotlib进行画图时,如果涉及到中文字符,很容易出现乱码的问题。这让我们在阅读和展示代码的过程中感到十分不便,因此需要解决它。 解决方法 方法一、导入matplotlib的字体库 我们可以使用以下代码导入 matplotlib 的字体库…

    python 2023年5月18日
    00
  • Python实现连接postgresql数据库的方法分析

    下面我详细讲解Python连接PostgreSQL数据库的方法。 1. 安装依赖 在Python中连接PostgreSQL需要借助一个叫做psycopg2的库,首先需要先安装这个库。 可以通过pip命令来安装: pip install psycopg2-binary (注意,这里使用的是二进制版本的psycopg2库,安装速度更快,如果你的Python环境被…

    python 2023年6月7日
    00
  • 基于python中pygame模块的Linux下安装过程(详解)

    基于python中pygame模块的Linux下安装过程(详解) 介绍 Pygame是一个非常流行的Python游戏开发库,它提供了丰富的游戏开发API和工具,包括图形库、音频库、事件处理以及其他工具等功能。 本文将提供一份详细的Linux下安装Pygame的攻略,旨在帮助那些想要在Linux系统中使用Pygame开发游戏的开发者,特别是那些对Python开…

    python 2023年6月2日
    00
  • 从零学Python之入门(三)序列

    以下是关于《从零学Python之入门(三)序列》的完整攻略。 知识点概述 本章节主要讲解序列数据类型,包括字符串、列表、元组等。其中,字符串是一类特殊的列表,具有特殊的性质。序列具有很多操作和方法,例如索引、切片、拼接、遍历等,需要掌握。本章还介绍了列表推导式、元组和解包和zip函数,这些常用的编程技巧。 字符串 字符串是一个字符序列,可以进行一些字符串特有…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部