详解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 双循环遍历list 变量判断代码

    以下是“Python双循环遍历list变量判断代码”的完整攻略。 1. 双循环遍历list变量 在Python中,可以使用双循环遍历list变量,以实现对list中元素的判断。示例如下: my_list = [1, 2, 3, 4, 5, 6] for i in my_list: for j in my_list: if i + j == 7: print(…

    python 2023年5月13日
    00
  • Python3 pip3 list 出现 DEPRECATION 警告的解决方法

    当我们在 Python3 环境下使用 pip3 list 命令查询安装的包时,有时会出现以下的警告信息: DEPRECATION: Python 3.4 support has been deprecated. pip 19.1 will be the last one supporting it. Please upgrade your Python as…

    python 2023年5月14日
    00
  • Java 中 Map 集合的三种遍历方式小结

    下面我将为您详细讲解“Java 中 Map 集合的三种遍历方式小结”。 1. Map 集合的概述 Map 是一种键值对映射的集合接口,它允许使用键来查找值。在 Java 中,常用的 Map 实现类有 HashMap、TreeMap、LinkedHashMap,它们都实现了 Map 接口。 2. Map 集合的三种遍历方式 2.1 基于遍历键的集合方式 在遍历…

    python 2023年5月14日
    00
  • Python urllib库的使用指南详解

    Python urllib库的使用指南详解 什么是Python urllib库? Python urllib库是Python标准库中用于和网站进行交互的工具包。它可以用于发送HTTP请求,从服务器获取响应,并对响应进行处理。Python urllib库包含4个模块:urllib.request、urllib.response、urllib.parse和url…

    python 2023年6月3日
    00
  • Python+Tkinter简单实现注册登录功能

    我们就来详细讲解一下“Python+Tkinter 简单实现注册登录功能”的完整攻略。 概要 在这个攻略中,我们会通过 Python 和 Tkinter 库来实现一个简单的注册登录功能。其中,我们将会用到以下几个模块: Tkinter:用于 GUI 编程 sqlite3:用于实现用户数据的存储和查询 hashlib:用于对密码进行哈希加密 在我们的应用中,用…

    python 2023年6月13日
    00
  • 实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250

    标题:使用Scrapy爬取豆瓣电影TOP250 介绍 在本文中,我们将使用Python的爬虫框架Scrapy来抓取豆瓣电影TOP250的信息。Scrapy是一个高效且易于使用的Web爬虫框架,可以帮助我们快速地从网络上抓取所需要的信息。 步骤 创建一个Scrapy项目 在命令行中输入以下命令,创建一个Scrapy项目: scrapy startproject…

    python 2023年5月14日
    00
  • python 无损批量压缩图片(支持保留图片信息)的示例

    如果需要批量处理一些图片文件,并且同时要求对图片进行无损压缩,可以使用Python编程语言来实现。下面是针对Python 3.x版本的一个基本的示例代码,用于无损批量压缩一整个目录下的所有图片文件,并且保留原图片信息。 import os import sys from PIL import Image import argparse def resize_…

    python 2023年6月3日
    00
  • Python中typing模块的具体使用

    Python中的typing模块提供了类型提示功能,允许开发者对变量、函数参数和返回值等进行类型注释,以提高代码的可读性和可维护性。下面让我详细讲解一下typing模块的具体使用: 1. 基本类型注解 typing模块中提供了一些基本类型注解,如List、Dict、Tuple、Set、Iterable、Iterator、Any、Union等。 这些类型可以用…

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