详解Python 队列(先进先出)

Python 队列(先进先出) 使用方法完整攻略

在 Python 中,队列是常见的数据结构之一,常用于数据的缓存、异步任务处理等场景中。Python原生支持队列的使用,本文将介绍Python队列的操作以及常见的使用方法。

初始化队列

首先,需要引入Python Queue模块。Python Queue分为两种: Queue 和 PriorityQueue。

import Queue

# 初始化 Queue 队列
q = Queue.Queue()

# 初始化 PrioriryQueue 队列
pq = Queue.PriorityQueue()

区别在于PriorityQueue由于可以设置优先级,因此入队时需要传入元组 (priority_number, value)。其余方法和Queue相同。

常用方法

Queue中常用的方法如下:
1. q.put(item):将item数据入队
2. q.get():返回队列中的第一个元素,并将其从队列中移除
3. q.qsize():返回队列中的元素个数
4. q.empty():如果队列为空,返回True,否则返回False
5. q.full():如果队列满了,返回True,否则返回False

PriorityQueue除此之外,还有以下两个方法:
1. pq.put(priority_number, item):将元组 (priority_number, item) 入队
2. pq.get():返回优先级最高的那个元素,并将其从队列中移除。若有多个优先级相等的元素,返回其中任意一个。

对于上述方法的使用,我们可以举出以下两个示例:

示例一:使用 Queue 完成异步任务

import Queue
import threading
import time

# 定义异步任务线程类
class AsyncTaskThread(threading.Thread):
    def __init__(self, task_queue):
        threading.Thread.__init__(self)
        self.task_queue = task_queue

    def run(self):
        while True:
            # 从队列中获取任务
            task = self.task_queue.get()

            # 执行任务
            print('start task {}'.format(task))
            time.sleep(1)
            print('finish task {}'.format(task))

            # 通知任务已完成
            self.task_queue.task_done()

# 初始化队列
q = Queue.Queue()

# 添加任务
for i in range(5):
    q.put(i)

# 启动两个线程,执行异步任务
for i in range(2):
    t = AsyncTaskThread(q)
    t.daemon = True
    t.start()

# 等待任务完成
q.join()

该示例中,我们定义了一个 AsyncTaskThread 线程,通过 Queue 队列将任务添加到队列中,启动两个线程来执行异步任务。执行的任务相对较简单,每个任务只是暂停了一秒钟。注意,最后我们通过 task_done() 方法通知 Queue 该任务已完成。

示例二:使用 PriorityQueue 实现任务的优先级

import Queue
import threading
import time

# 定义任务类
class Task(object):
    def __init__(self, priority, description):
        self.priority = priority
        self.description = description

    def __cmp__(self, other):
        return cmp(self.priority, other.priority)

# 定义异步任务线程类
class AsyncTaskThread(threading.Thread):
    def __init__(self, task_queue):
        threading.Thread.__init__(self)
        self.task_queue = task_queue

    def run(self):
        while True:
            # 从队列中获取任务
            task = self.task_queue.get()

            # 执行任务
            print('start task {} with priority {}'.format(task.description, task.priority))
            time.sleep(1)
            print('finish task {} with priority {}'.format(task.description, task.priority))

            # 通知任务已完成
            self.task_queue.task_done()

# 初始化队列
pq = Queue.PriorityQueue()

# 添加任务
pq.put((1, Task(1, 'low priority task')))
pq.put((3, Task(3, 'high priority task')))
pq.put((2, Task(2, 'medium priority task')))

# 启动两个线程,执行异步任务
for i in range(2):
    t = AsyncTaskThread(pq)
    t.daemon = True
    t.start()

# 等待所有任务完成
pq.join()

该示例中,我们使用 PriorityQueue 来实现任务的优先级控制。因为 PriorityQueue 本身支持元组 (priority, value) 的入队操作,因此我们通过封装 Task 类,并重载 __cmp__ 方法以便于 PriorityQueue 进行优先级排序。其他部分和示例一类似。

以上是 Python 队列的常见操作和用法,这里只是对其进行了简单的介绍,更多详细的使用方法和注意事项,可以参考 Python 开发者文档。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python 队列(先进先出) - Python技术站

(0)
上一篇 2023年3月25日
下一篇 2023年3月25日

相关文章

  • Python脚本操作Excel实现批量替换功能

    下面为您详细讲解 “Python脚本操作Excel实现批量替换功能” 的完整实例教程。 准备工作 在开始操作 Excel 前,需要先安装 Python 相关的依赖库。其中主要需要安装的是 openpyxl 库,用来操作 Excel 表格。 可以通过以下命令安装: pip install openpyxl 打开 Excel 文件 首先,我们需要打开 Excel…

    python 2023年5月13日
    00
  • Python 函数装饰器详解

    我来详细讲解一下“Python 函数装饰器”的完整攻略。 一、什么是Python函数装饰器 函数装饰器是一种可以动态地给一个函数增加功能的方式。在不改变原有函数的代码的情况下,可以通过“装饰”原函数来对其进行修改。Python中有很多内置的装饰器,比如classmethod、staticmethod和property等。此外,Python中还提供了自定义装饰…

    python 2023年6月3日
    00
  • python中二分查找法的实现方法

    二分查找法是一种常用的查找算法,它可以在有序数组中快速查找指定元素。本文将详细讲解Python中二分查找法的实现方法。 1. 二分查找法的原理 二分查找法的原理是将有序数组分成两部分,然后判断要查找的元素在哪一部分中,再在该部分中继续进行二分查找,直到找到要查找的元素或者确定该元素不存在为止。 具体实现过程如下: 将有序数组的左边界设为0,右边界设为数组长度…

    python 2023年5月14日
    00
  • Python 2.x.x 中的模块导入

    【问题标题】:Module import in Python 2.x.xPython 2.x.x 中的模块导入 【发布时间】:2023-04-04 21:12:01 【问题描述】: 我想使用我以前的程序作为一个模块。但是当我导入该程序时,程序会自动运行。我不想运行程序。我只想将该程序作为一个模块导入到我的新程序中,我使用该模块中的函数或变量。我试图添加这一行…

    Python开发 2023年4月6日
    00
  • 详解超星脚本出现乱码问题的解决方法(Python)

    下面我来详细讲解“详解超星脚本出现乱码问题的解决方法(Python)”。 背景介绍 超星学习通是国内知名在线教育平台,有许多Python编写的爬虫程序用于爬取超星学习通的课程资源。但是在爬取课程资源的时候,经常会遇到乱码问题,导致爬虫程序无法正常运行。那么如何解决该问题呢?下面就来详细讲解。 乱码问题原因 超星学习通网站的编码格式为GBK,而Python默认…

    python 2023年5月20日
    00
  • Python常用数据类型之间的转换总结

    当我们在Python中进行编程时,常常需要将一个数据类型转换为另一个数据类型。Python提供了多种数据类型之间的转换方法,包括int()、float()、str()、list()、tuple()和dict()等。以下是Python常用数据类型之间的转换总结。 int()函数 int()用于将其他数据类型转换为整数类型。以下是一个示例,演示如何使用int()…

    python 2023年5月13日
    00
  • Python抓取淘宝下拉框关键词的方法

    本文将介绍如何使用Python抓取淘宝下拉框关键词的方法。以下是本文将介绍的: 使用Selenium库模拟浏览器操作 使用BeautifulSoup库解析页面内容 抓取淘宝下拉框关键词 示例说明 使用Selenium库模拟浏览器操作 在Python中,我们可以使用Selenium库模拟浏览器操作。以下是使用Selenium库模拟浏览器操作的示例代码: fro…

    python 2023年5月14日
    00
  • python结合opencv实现人脸检测与跟踪

    下面是完整的Python结合OpenCV实现人脸检测与跟踪的攻略。 1. 确认环境 在开始之前,我们需要确认环境中已经安装好了Python和OpenCV库。可以使用以下命令检查: python –version pip install opencv-python 2. 人脸检测 在OpenCV中,可以使用haar级联分类器检测人脸。首先,我们需要下载已经训…

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