详解python数据结构之队列Queue

详解Python数据结构之队列 (Queue)

在计算机科学中,队列(Queue)是一种数据结构,可以用于按顺序存储和访问元素。该数据结构遵循先进先出(FIFO)原则,人们可以从队列的前面插入元素,从队列的后面删除元素。Python内置了队列模块(queue),这个模块实现了多线程安全队列、同步机制及相关数据结构。Queue模块提供了三种队列类型:

  • FIFO队列 - 先进先出队列
  • LIFO队列 - 后进先出队列
  • 优先级队列 - 带优先级的队列

1. FIFO队列

FIFO队列即先进先出队列。在这种类型的队列中,最先加入队列的元素总是率先删除。

1.1 创建队列和入队出队操作

在Python中,您可以使用Queue.Queue类创建一个空的FIFO队列。以下代码片段说明了如何创建一个FIFO队列,然后将一些元素添加到队列中并将它们推出。

import queue  # 引入queue模块

# 创建一个FIFO队列
my_queue = queue.Queue()

# 将元素添加到队列中
my_queue.put('hello')
my_queue.put('world')

# 从队列中弹出元素
print(my_queue.get())  # Output: 'hello'
print(my_queue.get())  # Output: 'world'

Python队列提供了以下方法:

  • Queue.qsize() 返回队列的大小
  • Queue.empty() 如果队列为空,则返回True;否则返回False。
  • Queue.full() 如果队列已满,则返回True;否则返回False。
  • Queue.put(item) 将item添加到队列中
  • Queue.put(item, block=True, timeout=None) 将item添加到队列中,等待指定时间
  • Queue.get() 从队列中删除并返回一个项。
  • Queue.get(block=True, timeout=None) 从队列中删除并返回一个项,等待指定时间。

1.2 线程安全的FIFO队列

Python队列提供了一种名为queue.Queue的线程安全实现。在多线程应用程序中使用队列通常是安全的,并且可以避免使用锁,条件变量或其他同步机制。

以下代码段说明了如何使用queue.Queue在多线程应用程序中实现线程安全的FIFO队列:

import queue
import threading

def worker(q):
    while True:
        item = q.get()
        if item is None:
            break
        print(item)
        q.task_done()

my_queue = queue.Queue()
num_worker_threads = 4

# 创建并启动线程
threads = []
for i in range(num_worker_threads):
    t = threading.Thread(target=worker, args=(my_queue,))
    t.start()
    threads.append(t)

# 将元素添加到队列中
for item in range(10):
    my_queue.put(item)

# 队列中每个元素处理完成
my_queue.join()

# 关闭线程
for i in range(num_worker_threads):
    my_queue.put(None)
for t in threads:
    t.join()

上述代码启动四个工作线程(4个线程),将10个元素添加到一个FIFO队列中,并将它们全部删除。

2. LIFO队列

LIFO队列即后进先出队列。在这种类型的队列中,最后加入队列的元素总是率先删除。

2.1 创建LIFO队列和入队出队操作

Python队列模块还提供了一种名为LifoQueue的后进先出(LIFO)队列。以下代码片段演示如何使用Queue.LifoQueue创建一个LIFO队列,然后将一些元素添加到队列中并将它们推出。

import queue  # 引入队列模块

# 创建一个LIFO队列
my_lifo_queue = queue.LifoQueue()

# 将元素添加到队列中
my_lifo_queue.put('hello')
my_lifo_queue.put('world')

# 从队列中弹出元素
print(my_lifo_queue.get())  # Output: 'world'
print(my_lifo_queue.get())  # Output: 'hello'

此代码示例创建了一个后进先出队列并添加了两个元素,并使用Queue.get()方法从队列中删除元素从而实现后进先出的效果。

2.2 线程安全的LIFO队列

Queue模块还提供了一种名为queue.LifoQueue的线程安全实现的后进先出(LIFO)队列类型。以下是如何使用queue.LifoQueue在多线程应用程序中实现线程安全的LIFO队列的示例代码片段:

import queue
import threading

def worker(q):
    while True:
        item = q.get()
        if item is None:
            break
        print(item)
        q.task_done()

my_lifo_queue = queue.LifoQueue()
num_worker_threads = 4

# 创建和启动线程
threads = []
for i in range(num_worker_threads):
    t = threading.Thread(target=worker, args=(my_lifo_queue,))
    t.start()
    threads.append(t)

# 将元素添加到队列中
for item in range(10):
    my_lifo_queue.put(item)

# 队列中每个元素处理完成
my_lifo_queue.join()

# 关闭线程
for i in range(num_worker_threads):
    my_lifo_queue.put(None)
for t in threads:
    t.join()

3. 优先级队列

优先级队列是一种独特的队列,具有优先级概念。队列中的每个元素都具有优先级值,并且较高优先级的元素在相同条件下排在队列的前面。

3.1 创建优先级队列和入队出队操作

Python的优先级队列由Queue.PriorityQueue类实现。 在Queue.PriorityQueue内部,元素的优先级是作为元组(值,优先级)中的值提供的,其中优先级值较低的元素优先级较高(在特定值之间)。

import queue

# 创建一个优先级队列
my_priority_queue = queue.PriorityQueue()

# 将元素添加到队列中
my_priority_queue.put((2, "world"))
my_priority_queue.put((1, "hello"))

# 从队列中弹出元素
print(my_priority_queue.get()[1])  # Output: 'hello'
print(my_priority_queue.get()[1])  # Output: 'world'

此示例说明了如何使用queue.PriorityQueue类创建一个优先级队列,并定义了两个元素,然后将它们添加到队列中。然后,使用Queue.get()方法从队列中删除这些元素。在此示例中,由于“hello”元素的优先级低于“world”元素,因此“hello”元素将在“world”元素之前弹出。

3.2 线程安全的优先级队列

Queue模块还提供了一种名为queue.PriorityQueue的线程安全实现的优先级队列类型。 在多线程应用程序中使用此类实现线程安全的优先级队列非常安全。

import queue
import threading

def worker(q):
    while True:
        item = q.get()
        if item is None:
            break
        print(item)
        q.task_done()

my_priority_queue = queue.PriorityQueue()
num_worker_threads = 4

# 创建和启动线程
threads = []
for i in range(num_worker_threads):
    t = threading.Thread(target=worker, args=(my_priority_queue,))
    t.start()
    threads.append(t)

# 向队列添加更重要的任务
my_priority_queue.put((1, "hello"))

# 向队列添加不那么重要的任务
my_priority_queue.put((2, "world"))

# 等待队列中的所有元素都被处理完
my_priority_queue.join()

# 关闭线程
for i in range(num_worker_threads):
    my_priority_queue.put(None)
for t in threads:
    t.join()

此示例说明了如何使用queue.PriorityQueue类创建一个线程安全的优先级队列,并启动一个多线程应用程序。 然后,代码向优先级队列添加两个元素。次优先级的任务被放置在队列的顶部,优先级较低的任务被放置在队列的底部。程序最后等待队列被处理完并结束线程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解python数据结构之队列Queue - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • PAT甲级真题1020.树的遍历

    翻译和代码思路:Acwing 一个二叉树,树中每个节点的权值互不相同。 现在给出它的后序遍历和中序遍历,请你输出它的层序遍历。 输入格式 第一行包含整数 N,表示二叉树的节点数。 第二行包含 N个整数,表示二叉树的后序遍历。 第三行包含 N 个整数,表示二叉树的中序遍历。 输出格式 输出一行 N个整数,表示二叉树的层序遍历。 数据范围 1<=N<…

    算法与数据结构 2023年4月17日
    00
  • C语言植物大战数据结构快速排序图文示例

    C语言植物大战数据结构的快速排序可以分为以下步骤: 准备工作 首先需要定义一个关于植物大战中植物的结构体,例如: struct Plant { int hp; int atk; int cost; }; 然后准备一个装载植物信息的数组: struct Plant plants[] = { {75, 36, 100}, {100, 20, 50}, {125,…

    数据结构 2023年5月17日
    00
  • C语言线性表之双链表详解

    C语言线性表之双链表详解 前言 本教程将详细介绍C语言中双链表的实现方法以及相关操作,适合有一定C语言基础的读者。 双链表定义 双链表是一种常见的数据结构,与单链表不同,双链表中每个节点不仅有指向后续节点的指针,还有指向前续节点的指针,即“双向链表”。 双链表的节点结构体可以定义如下: typedef struct double_node{ int data…

    数据结构 2023年5月17日
    00
  • C语言数据结构之队列算法详解

    C语言数据结构之队列算法详解 什么是队列? 在计算机科学中,队列是一种抽象数据类型或线性数据结构。它具有先进先出(FIFO)的特性,即先进入队列的元素先被处理或先被移除。队列通常用于解决先到先服务的问题(如请求处理),但也常用于广泛的异步编程中。 队列的特点 队列通常具有以下特点: 队列可以为空; 队列从队首插入元素,从队尾移除元素; 队列只允许从队尾插入元…

    数据结构 2023年5月17日
    00
  • Java 超详细讲解数据结构的应用

    Java 超详细讲解数据结构的应用 简介 “Java 超详细讲解数据结构的应用”是一个基于Java语言的数据结构教程,其中包含了各种数据结构的理论知识和实际应用,在学习过程中可以帮助初学者更好地理解数据结构的本质和实际应用场景。 学习路径 数据结构理论 在本教程中,我们首先介绍了数据结构的几种基本分类和常用的数据结构,包括数组、链表、栈、队列、堆、树、图等等…

    数据结构 2023年5月17日
    00
  • 常用的Java数据结构知识点汇总

    常用的Java数据结构知识点汇总 简介 Java中的数据结构是Java程序开发中非常重要的一部分。掌握常用的数据结构知识点是编写高效、优秀的Java程序的关键之一。本文将详细讲解Java中常用的数据结构知识点,并提供代码示例说明。 数组(Array) 数组是一组相同类型的数据集合,通过数组下标来访问数据,数组长度确定后就无法改变。在Java中,数组可以是基本…

    数据结构 2023年5月17日
    00
  • Java数据结构之基于比较的排序算法基本原理及具体实现

    Java数据结构之基于比较的排序算法基本原理及具体实现 前言 排序算法是计算机科学中最基本的算法之一,其广泛应用于各领域中。基于比较的排序算法是一种流行的排序算法类型,本篇文章将阐述其基本原理及具体实现,以帮助读者深入了解该算法。 算法介绍 基于比较的排序算法是根据元素之间的比较操作来完成排序的一种算法类型,它可以对各种数据类型进行排序,如整数、浮点数、字符…

    数据结构 2023年5月17日
    00
  • Java数据结构之顺序表篇

    Java数据结构之顺序表篇 什么是顺序表 顺序表是由一组地址连续、大小相等的存储单元依次存储数据元素的线性表。 顺序表的表示 Java语言中,可以使用数组来表示顺序表。 public class SeqList<T> { private Object[] element;// 定义数组存储数据元素 private int length;// 当前…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部