详解Python中的四种队列

yizhihongxing

在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 os.mkdir()与os.makedirs()的使用区别

    当我们需要在Python脚本中创建一个文件夹时,可以使用Python内置的os模块中提供的os.mkdir()函数或os.makedirs()函数。这两个函数都用于在指定路径创建新目录,但它们之间有一些区别,本文将详细介绍其使用区别。 os.mkdir() os.mkdir()函数用来创建单层目录,即在指定路径上创建一个新目录,如果路径的上级目录不存在,则会…

    python 2023年6月2日
    00
  • Python爬虫图片懒加载技术 selenium和PhantomJS解析

    Python爬虫图片懒加载技术 selenium和PhantomJS解析 本文将介绍如何利用Python爬虫对使用懒加载技术的网页上的图片进行爬取。在这里我将使用selenium和PhantomJS解析器作为我们工具。其中selenium是一个流行的Web自动化测试框架,可以模拟用户在浏览器上的各种操作,而PhantomJS是一个无界面的,基于WebKit的…

    python 2023年5月14日
    00
  • Python splitlines使用技巧

    Python splitlines使用技巧 splitlines() 是 Python 内置的字符串方法, 它用于分离字符串中的行并返回分离后的行作为列表。 这个方法遵循一些常见的行分隔符,包括 “\n”, “\r”, 和 “\r\n”。返回列表中不包含包含分隔符本身的,只包含行内容的字符串。 基本用法 splitlines() 方法不接受任何参数。它仅适用…

    python 2023年6月6日
    00
  • Python 实现数据库(SQL)更新脚本的生成方法

    关于”Python 实现数据库(SQL)更新脚本的生成方法”,这里我将提供以下步骤: 步骤1:安装python库 首先需要安装Python库,其中最主要的是pymysql库(关于pymysql库的参考链接:https://pypi.org/project/PyMySQL/)。可以使用pip命令进行安装。 pip install pymysql 步骤2:编写P…

    python 2023年6月3日
    00
  • Python基于httpx模块实现发送请求

    Python 基于 httpx 模块实现发送请求 httpx 是一个 Python 的 HTTP 客户端库,它提供了简单易用的 API,支持异步和同步请求。以下是 Python 基于 httpx 模块实现发送请求的详细介绍。 安装 httpx 在使用 httpx 模块发送请求之前,我们需要先安装 httpx。可以使用 pip 命令来安装 httpx: pip…

    python 2023年5月15日
    00
  • pycharm配置python 设置pip安装源为豆瓣源

    下面是“PyCharm配置Python设置pip安装源为豆瓣源”的完整攻略: 1. 确认Python解释器版本 首先,在使用PyCharm配置pip安装源之前,需要先确认当前项目使用的Python解释器版本。 可以通过 PyCharm 菜单栏中的 “File” > “Settings” > “Project Interpreter” 来查看已经安…

    python 2023年5月14日
    00
  • Python函数中的不定长参数相关知识总结

    下面是关于“Python函数中的不定长参数相关知识总结”的完整攻略: 1.什么是不定长参数 在Python中,有时候函数的参数个数是不确定的,这就需要我们使用不定长参数。不定长参数包括两种:可变参数和关键字参数。 可变参数是指传入的参数个数是不确定的,可变参数在函数内部自动组装为元组(tuple)类型。 关键字参数是指传入的参数个数也是不确定的,但是和普通参…

    python 2023年5月13日
    00
  • Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释

    Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释 BeautifulSoup是一个Python库,用于解析HTML和XML文档,并提供了一些方便的方法来获取和操作文档中的元素。在Python爬虫中,BeautifulSoup是常用的工具之一。本文将介绍如何使用BeautifulSoup获取对象(标签)名、属性、内容和注释。 获…

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