【学习心得】Python中的queue模块使用

一、Queue模块的知识点思维导图

二、Queue模块常用函数介绍

queue模块是内置的,不需要安装直接导入就可以了。

(1)创建一个Queue对象

import queue

# 创建一个队列实例
q = queue.Queue(maxsize=20)   # 可选参数,默认为无限大

(2)入队

# 导入Python标准库中的queue模块,该模块提供了线程安全的队列数据结构
import queue

# 创建一个Queue对象,可以理解为初始化一个队列,参数maxsize默认为0,表示队列大小无限制
q = queue.Queue()

# 使用for循环将数字0到9依次放入队列中
# put方法用于将元素放入队列尾部,即执行入队操作
for i in range(10):
    q.put(i)  # 这里每执行一次,就将i(0-9)作为一个元素放入队列中

# 此时,队列q中按照先进先出(FIFO)原则存储了数字0-9

(3)出队

# 导入Python内置的queue模块,其中包含线程安全的队列数据结构
import queue

# 创建一个Queue对象,即初始化一个空队列
q = queue.Queue()

# 使用for循环将0到9这10个整数依次入队
# put方法将元素添加到队列的末尾
for i in range(10):
    q.put(i)  # 每次循环都将i作为元素放入队列中

(4)判空

# 导入Python内置的queue模块,其中包含线程安全的队列数据结构
import queue

# 创建一个Queue对象,即初始化一个空队列
q = queue.Queue()

# 使用for循环将0到9这10个整数依次入队
# put方法将元素添加到队列的末尾
for i in range(10):
    q.put(i)  # 每次循环都将i作为元素放入队列中

# 使用while循环检查队列是否为空
# 当队列不为空时,持续执行循环体内的操作
while not q.empty():  
    # 使用get方法从队列中取出并移除一个元素
    # 默认情况下,get方法会阻塞直到有元素可用(除非设置了非阻塞模式)
    data = q.get()  

    # 打印从队列中取出的元素
    print(data)

# 当队列为空时,while循环结束
# 此时所有之前入队的整数0-9会被按照先进先出(FIFO)的原则依次出队并打印

(5)判满

import queue

# 初始化一个容量为5的队列
q = queue.Queue(maxsize=5)

# 入队操作
for i in range(10):
    # 在入队前检查队列是否已满
    if q.full():
        print("Queue is full, cannot insert more items.")
    else:
        q.put(i)

    # 若队列已满,可以选择等待一段时间后重试或其他处理策略
    if q.full():
        time.sleep(1)  # 假设休眠一秒后重试
        continue

while not q.empty():
    data = q.get()
    print(data)

(6)获取队列长度

import queue

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

# 将10个元素放入队列
for i in range(10):
    q.put(i)

# 打印队列长度
print(f"Queue size before processing: {q.qsize()}")

# 处理队列中的元素,同时打印队列长度
while not q.empty():
    data = q.get()
    print(f"Processing element: {data}, current queue size: {q.qsize()}")

# 在处理过程中,每次从队列中取出一个元素后,队列长度都会减一

(7)task_done() 和 unfinished_tasks

import queue
import threading

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

# 生产者线程将任务放入队列
def producer():
    for i in range(10):
        q.put(i)
        print(f"Producer added task: {i}")

# 消费者线程从队列中取出并处理任务
def consumer():
    while True:
        task = q.get()  # 获取任务
        print(f"Consumer started working on task: {task}")
        
        # 这里模拟任务处理过程
        # 实际应用中,此处应替换为实际的任务处理逻辑
        process_task(task)

        # 任务处理完毕,调用 task_done()
        q.task_done()
        print(f"Consumer finished task: {task}")

        # 检查队列是否为空且所有任务都已经完成
        if q.empty() and q.unfinished_tasks == 0:
            print("All tasks completed, exiting consumer.")
            break

# 创建并启动生产者线程
p = threading.Thread(target=producer)
p.start()
p.join()  # 确保生产者线程完成任务

# 创建并启动消费者线程
c = threading.Thread(target=consumer)
c.start()
c.join()  # 等待消费者线程处理完所有任务并退出

# 由于消费者线程在所有任务完成后退出,所以在此处不需要再次检查队列状态

(8)join

import queue
import threading

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

# 生产者线程将任务放入队列
def producer():
    for i in range(10):
        q.put(i)
    print("Producer has added all tasks.")

# 消费者线程从队列中取出并处理任务
def consumer():
    while True:
        task = q.get()  # 获取任务
        print(f"Consumer started working on task: {task}")
        
        # 这里模拟任务处理过程
        # 实际应用中,此处应替换为实际的任务处理逻辑
        process_task(task)

        # 任务处理完毕,调用 task_done()
        q.task_done()
        print(f"Consumer finished task: {task}")

        # 检查队列是否为空
        if q.empty():
            print("No more tasks in the queue.")
            break

# 创建并启动生产者线程
p = threading.Thread(target=producer)
p.start()
p.join()  # 确保生产者线程完成任务添加

# 创建并启动消费者线程
c = threading.Thread(target=consumer)
c.start()

# 主线程等待所有任务完成
q.join()  # 阻塞主线程,直到所有从队列中取出的任务都被标记为完成

print("All tasks have been processed and marked as done.")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/526504.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

libVLC 提取视频帧使用QWidget渲染

在前面的文章中,我们使用libvlc_media_player_set_hwnd设置了视频的显示的窗口。 libvlc_media_player_set_hwnd(vlc_mediaPlayer, (void *)ui.widgetShow->winId()); 如果我们想要提取每一帧数据,将数据渲染到QWidget上,该如何操作呢&a…

西圣、漫步者、万魔开放式耳机怎么样?无广真实测评对比推荐

开放式耳机因其独特的音质体验和佩戴舒适度,受到了越来越多消费者的青睐。西圣、漫步者、万魔作为国内知名的耳机品牌,各自都推出了自家的开放式耳机产品,那么,这三款耳机究竟如何呢?身为开放式耳机党的我,…

小白如何挖到自己的第一个漏洞

目录 挖洞公式 个人介绍 我的技术与生活——小站首页 | Hexohttps://xiaoyunxi.wiki/ 漏洞介绍 漏洞详情 如何进行信息收集(最快捷) 方法1(Google Hacking) 0x01 常见Google语法 0x02 不是经常用的关键字 0x03 特殊符号使用 0x04 布尔操作 0x05注意事项 0x06 使用…

【C++ STL算法】sort 排序

文章目录 【 1. 基本原理 】【 2. sort 的应用 】实例 - sort 函数实现 升序排序和降序排序 函数名用法sort (first, last)基于 快速排序,对容器或普通数组中 [ first, last ) 范围内的元素进行排序,默认进行升序排序(从小到大)。…

在linux上面安装nexus私有maven库

问题 需要在EC2机器上面安装私有maven库。 步骤 更新OS sudo yum update -yJDK11 # 安装JDK11 sudo yum install java-11-amazon-corretto # 查询jdk11位置 sudo alternatives --config java内容如下: There are 2 programs which provide java.Selection …

用动态IP采集数据总是掉线是为什么?该怎么解决?

动态IP可以说是做爬虫、采集数据、搜集热门商品信息中必备的代理工具,但在爬虫的使用中,总是会遇到动态IP掉线的情况,从而影响使用效率,本文将探讨动态IP代理掉线的几种常见原因,并提供解决方法,以帮助大家…

libVLC 提取视频帧使用OpenGL渲染

在上一节中,我们讲解了如何使用QWidget渲染每一帧视频数据。 由于我们不停的生成的是QImage对象,因此对 CPU 负荷较高。其实在绘制这块我们可以使用 OpenGL去绘制,利用 GPU 减轻 CPU 计算负荷,本节讲解使用OpenGL来绘制每一帧视频…

ctfshow web入门 php特性 web108--web115

web108 ereg函数相当于而preg_match()函数 ereg函数的漏洞:00截断。%00截断及遇到%00则默认为字符串的结束 strrev函数就是把字符串倒过来 就是说intval处理倒过来的传参c0x36d(877)?ca%00778 web109 异常处理类 通过异常处理类Excepti…

国外动态住宅IP代理的五大优势

在当前的数字时代,随着网络监控和地理限制的日益增强,国外动态住宅IP代理成为了解决这些问题的关键工具。它不仅能够保护用户的个人隐私,提供高度的匿名性,还能轻松突破访问限制,让全球的内容触手可及。对于数据科学家…

Vue+OpenLayers7入门到实战:OpenLayers加载WFS服务的要素资源数据并叠加到地图上

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战 前言 本章讲解如何使用OpenLayers6加载WFS服务的要素资源数据并叠加到地图上的功能。 WFS规范介绍 WFS是基于地理要素级别的数据共享和数据操作,WFS规范定义了若干基于地理要素(Feature)级别的数据操作接口…

PL2303HXA自2012已停产,请联系供货商的解决方法

一、概述 Win10不支持PL2303HXA usb串口,当管理员做配置的时候发现无法查看端口信息,设备管理器提示:PL2303 HXA自2012已停产,请联系供货商。PL2303 是Prolific 公司生产的一种高度集成的RS232-USB接口转换器,可提供一…

(学习日记)2024.04.10:UCOSIII第三十八节:事件实验

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

微信多账号如何聚合聊天?

看这篇文章的你是否有以下烦恼: 1.微信账号太多,每次都要拿很多手机,管理起来很乱 2.微信号多,需要很多员工来管理,人工费用高 3.多个微信打开后会造成微信登陆界面过多,切换操作十分不方便 4.当微信多…

创建型模式--4.抽象工厂模式【弗兰奇一家】

1. 奔向大海 在海贼世界中,位于水之都的弗兰奇一家是由铁人弗兰奇所领导的以拆船为职业的家族,当然了他们的逆向工程做的也很好,会拆船必然会造船。船是海贼们出海所必备的海上交通工具,它由很多的零件组成,从宏观上看…

【案例·增】拼接字符串,增加字符型数据记录

问题描述: MySQL中的数据库表存在字符型(String)字段,要为其拼接信息以达成数据新增,可以使用 SQL 中的CONCAT()、CONCAT_WS()函数来处理 案例: #拼接字符串 SELECT CONCAT(HELLO, World);#举例:student学生表。sno…

为什么多数游戏服务端是用 C++ 来写呢,是历史原因还是性能方面的考虑?

游戏服务端开发语言的选择往往受到多方面因素的影响,其中C被广泛应用,这一现象的背后既包含了历史演进的原因,也凸显出性能至上的技术考量。 历史沿革 自上世纪80年代起,C语言便以其对C语言的兼容性、面向对象的特性以及对系统资…

搞懂LLM中的Token,看这一篇就够了

一、Token是什么? 1.1 Token一定表示一个汉字么? 下面这个例子中我让ChatGPT按照Token的划分粒度将“我喜欢苹果”进行倒序输出。 这个例子说明:Token既可能是一个单词,例如“苹果”,也可能是一个汉字,例…

新版本v24.1发布,私有网盘也能创建互联网对外分享链接了

24年龙年到来之际,我们发布了v24.1版本,其中商业版优先响应了客户期待已久的外网分享特性,现在客户既可以创建内网登录账号可用的分享链接,也可以安全地创建互联网可访问的公共链接,产品应用场景得到了延伸。而社区版则…

T-GATE:交叉注意力使文本到图像扩散模型中的推理变得麻烦

今天给大家带来最近一项非常有意思的研究通过计算出,交叉注意力的输出会趋向于一个固定点。 然后在保真度提升阶段忽略文本条件不仅可以减少计算的复杂性。并提出了TGATE这种简单而无需训练的方法,用于高效地生成图像。 TGATE的做法是,一旦交…

【利器篇】前端40+精选VSCode插件,总有几个你未拥有!

前言 姊妹篇: 【利器篇】35精选chrome插件,含15前端插件,总有一款值得你停留 关于关于 【前端工具系列】: 有句话,事半功倍,其必然是借助了某些思想和工具。 VSCode是我们前端开发的武器,本文…