详解Python中的四种队列

在Python中,队列是一种常用的数据结构,它可以用于实现多线程、异步编程等场景。Python中常用的队列有四种,分别是queue.Queuequeue.LifoQueuequeue.PriorityQueueasyncio.Queue。本文将详细介绍这四种队列的特点、用法和示例。

queue.Queue

queue.Queue是Python标准库中提供的队列实现,它是线程安全的,可以用于多线程编程。queue.Queue的基本用法如下:

import queue

q = queue.Queue(maxsize=0)

q.put(item, block=True, timeout=None)

item = q.get(block=True, timeout=None)

其中,maxsize表示队列的最大容量,如果为0,则表示队列的容量无限制。put()方法用于向队列中添加元素,block参数表示如果队列已满,是否阻塞等待,timeout参数表示等待的超时时间。get()方法用于从队列中取出元素,block参数表示如果队列为空,是否阻塞等待,timeout参数表示等待的超时时间。

示例说明

下面是一个示例,演示了如何使用queue.Queue实现多线程生产者-消费者模型:

import queue
import threading
import time

q = queue.Queue(maxsize=10)

class Producer(threading.Thread):
    def run(self):
        while True:
            if q.qsize() < 10:
                item = time.time()
                q.put(item)
                print('Produced', item)
                time.sleep(1)

class Consumer(threading.Thread):
    def run(self):
        while True:
            if not q.empty():
                item = q.get()
                print('Consumed', item)
                time.sleep(2)

p = Producer()
c = Consumer()
p.start()
c.start()

在这个示例中,我们定义了一个queue.Queue对象q,并定义了一个生产者线程Producer和一个消费者线程Consumer。生产者线程不断向队列中添加元素,消费者线程不断从队列中取出元素。由于queue.Queue是线程安全的,因此我们不需要使用锁等机制来保证线程安全。

queue.LifoQueue

queue.LifoQueue是Python标准库中提供的后进先出(LIFO)队列实现,它继承自queue.Queue,因此具有queue.Queue的所有特性。queue.LifoQueue的基本用法与queue.Queue相同。

示例说明

下面是一个示例,演示了如何使用queue.LifoQueue实现后进先出队列:

import queue

q = queue.LifoQueue()

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

print(q.get())  # 输出3
print(q.get())  # 输出2
print(q.get())  # 输出1

在这个示例中,我们首先定义了一个queue.LifoQueue对象q,然后向队列中添加了三个元素。由于queue.LifoQueue是后进先出队列,因此我们从队列中取出元素的顺序与添加的顺序相反。

queue.PriorityQueue

queue.PriorityQueue是Python标准库中提供的优先级队列实现,它继承自queue.Queue,因此具有queue.Queue的所有特性。queue.PriorityQueue的特点是可以按照元素的优先级进行排序,优先级高的元素先出队列。元素的优先级可以是任意可比较的类型,例如数字、字符串、元组等。

queue.PriorityQueue的基本用法如下:

import queue

q = queue.PriorityQueue(maxsize=0)

q.put(item, block=True, timeout=None)

item = q.get(block=True, timeout=None)

其中,maxsize表示队列的最大容量,如果为0,则表示队列的容量无限制。put()方法用于向队列中添加元素,block参数表示如果队列已满,是否阻塞等待,timeout参数表示等待的超时时间。元素的优先级通过元素本身的比较方法进行比较,因此不需要额外指定。

示例说明

下面是一个示例,演示了如何使用queue.PriorityQueue实现优先级队列:

import queue

q = queue.PriorityQueue()

q.put((3, 'apple'))
q.put((1, 'banana'))
q.put((2, 'cherry'))

print(q.get())  # 输出(1, 'banana')
print(q.get())  # 输出(2, 'cherry')
print(q.get())  # 输出(3, 'apple')

在这个示例中,我们首先定义了一个queue.PriorityQueue对象q,然后向队列中添加了三个元素,每个元素都是一个元组,第一个元素表示优先级,第二个元素表示元素本身。由于第二个元素是字符串,Python会使用字符串的比较方法进行比较,因此优先级相同时,按照字符串的字典序进行排序。

asyncio.Queue

asyncio.Queue是Python标准库中提供的异步队列实现,它可以用于异步编程。asyncio.Queue的基本用法如下:

import asyncio

q = asyncio.Queue(maxsize=0)

await q.put(item)

item = await q.get()

其中,maxsize表示队列的最大容量,如果为0,则表示队列的容量无限制。put()方法用于向队列中添加元素,get()方法用于从队列中取出元素。由于asyncio.Queue是异步队列,因此需要使用await关键字来等待队列操作的完成。

示例说明

下面是一个示例,演示了如何使用asyncio.Queue实现异步队列:

import asyncio

async def producer(q):
    while True:
        if q.qsize() < 10:
            item = time.time()
            await q.put(item)
            print('Produced', item)
            await asyncio.sleep(1)

async def consumer(q):
    while True:
        if not q.empty():
            item = await q.get()
            print('Consumed', item)
            await asyncio.sleep(2)

q = asyncio.Queue()
loop = asyncio.get_event_loop()
loop.create_task(producer(q))
loop.create_task(consumer(q))
loop.run_forever()

在这个示例中,我们定义了一个异步队列q,并定义了一个生产者协程producer和一个消费者协程consumer。生产者协程不断向队列中添加元素,消费者协程不断从队列中取出元素。由于asyncio.Queue是异步队列,因此我们需要使用asyncio.sleep()方法来等待队列操作的完成。最后,我们使用asyncio.get_event_loop()方法获取事件循环对象,创建生产者协程和消费者协程,并运行事件循环。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python中的四种队列 - Python技术站

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

相关文章

  • Python语音合成的项目实战(PyQt5+pyttsx3)

    下面来详细讲解“Python语音合成的项目实战(PyQt5+pyttsx3)”的完整攻略。 项目介绍 语音合成是将文字转化成语音的一种技术,常用于人机交互、无障碍辅助等领域。本项目使用Python中的Qt界面库PyQt5和语音合成库pyttsx3,开发一个简单的语音合成桌面应用程序。 实现步骤 安装必要的库 PyQt5: GUI库,提供了丰富的界面控件,可以…

    python 2023年5月19日
    00
  • 七个非常实用的Python工具包总结

    七个非常实用的Python工具包总结 Python是现今最流行的编程语言之一,拥有众多的工具包和库,可以方便地开发应用程序、web应用和数据科学等领域的程序。本篇文章将着重介绍七个非常实用的Python工具包,总结它们的用途、功能和示例操作。 1. Requests Requests是一个Python库,为HTTP通信提供了人性化的接口。Requests已被…

    python 2023年5月14日
    00
  • 解决python ogr shp字段写入中文乱码的问题

    解决python ogr shp字段写入中文乱码的问题,可以按照以下步骤进行操作: 设置系统编码为utf-8 在Python中,字符串默认使用ASCII编码。为了避免中文出现乱码的问题,在进行编码转换时,需要将系统编码设置为utf-8。 示例代码: import sys reload(sys) sys.setdefaultencoding(‘utf-8’) …

    python 2023年5月20日
    00
  • python 实现对数据集的归一化的方法(0-1之间)

    Python 实现对数据集的归一化的方法(0-1之间) 归一化是数据预处理中的一项重要工作。它可以将数值型的数据进行标准化处理,让数据按照一定的比例缩小到0-1之间,提高数据处理的精度。 在 Python 中,我们可以使用 sklearn 库中的 MinMaxScaler 类对数据集进行归一化。 步骤 导入需要的库 from sklearn.preproce…

    python 2023年6月3日
    00
  • Python爬取微信小程序Charles实现过程图解

    当你需要用Python爬取微信小程序的数据时,你可以使用Charles代理工具来进行抓包,获取请求和响应数据。下面是Python爬取微信小程序Charles实现过程的详细攻略: 步骤1:安装和配置Charles 首先,你需要在电脑上安装并启动Charles。安装完Charles之后,在Charles的Proxy菜单栏中找到Proxy Settings,把Pr…

    python 2023年5月23日
    00
  • 如何在 Windows python 3.6 中升级 dlib python 包

    【问题标题】:How to upgrade dlib python package in Windows python 3.6如何在 Windows python 3.6 中升级 dlib python 包 【发布时间】:2023-04-04 16:33:01 【问题描述】: 我正在使用 python3.6 并已在 Windows 10 x64 上使用其轮文…

    Python开发 2023年4月6日
    00
  • python创建n行m列数组示例

    下面给出一个详细的Python创建n行m列数组的攻略。 1. 使用numpy创建n行m列数组 numpy是Python中一个很擅长处理数值计算的第三方库,它提供了很多方便的方法来创建数组。我们可以使用numpy中的zeros方法来创建一个n行m列的全零数组,代码如下: import numpy as np n = 3 m = 4 arr = np.zeros…

    python 2023年6月5日
    00
  • Python requests用法和django后台处理详解

    以下是关于Python requests用法和Django后台处理的详细攻略: Python requests用法 Python requests是一个流行的HTTP库,用于向Web服务器发送HTTP请求和接收响应。以下是Python requests的基本用法: 安装requests库 在使用requests库之前,需要先安装它。可以使用以下命令在终端中安…

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