Python - 队列【queue】task_done()和join()基本使用

news2025/5/17 17:58:41

一. 前言

task_done()Pythonqueue模块提供的方法,用于通知队列管理器,已经处理完了队列中的一个项目。

queue.task_done()Queue对象的一个方法,它用于通知Queue对象,队列中的某一项已经被处理完毕。通常在使用Queue对象时,当生产者把数据放入队列中后,消费者需要从队列中取出数据并进行处理。当消费者处理完一项数据后,就可以使用queue.task_done()方法通知队列,这样Queue对象就可以知道队列中那一项已经被处理完毕了。

使用队列时,我们通常使用put()方法将项目添加到队列中,然后使用get()方法从队列中获取项目进行处理。在处理完一个项目后,我们可以使用task_done()方法通知队列管理器,这个项目已经被处理完了。

如果我们使用了join()方法等待所有的项目都被处理完,那么这个方法会在所有的项目都被处理完后返回。

二. 基本使用

示例代码

import queue
import threading

def worker(q):
    while True:
        item = q.get()
        print("Processing", item)
        q.task_done()

if __name__ == '__main__':
    q = queue.Queue()
    for i in range(5):
        q.put(i)

    for i in range(3):
        t = threading.Thread(target=worker, args=(q,))
        t.daemon = True
        t.start()

    q.join()
    print("All items processed.")

在上面的示例代码中,我们首先创建了一个队列q,并向其添加了5个项目。然后,我们创建了3个线程,每个线程使用worker()函数从队列中获取一个项目,并使用task_done()方法将其处理掉。由于我们使用了join()方法等待所有的项目都被处理完,因此在所有的项目都被处理完后,最后输出"All items processed."。

运行结果:
在这里插入图片描述

在这个示例中,task_done()方法每次从队列中取出一个项目就会被调用一次,因此,队列管理器最终会知道所有的项目都已经被处理完毕。

三. 任务实时完成通知使用

边读边取的示例代码:

这里定义了一个生产者和一个消费者,并使用Queue对象用于数据传输。生产者往队列中放入了10个数据项,每个数据项之间暂停1秒,而消费者从队列中取出数据项并进行处理,每次取出一个数据项后暂停2秒。在消费者处理完每个数据项之后,使用q.task_done()方法通知队列,以便队列可以知道已经有一项数据被处理完毕了。

import queue
import threading
import time


def producer(q):
    for i in range(10):
        q.put(i)
        print("[Producer] Put item {} into queue".format(i))
        time.sleep(1)


def consumer(q):
    while True:
        item = q.get()
        print("[Consumer] Get item {} from queue".format(item))
        q.task_done()
        print(f'task {threading.current_thread().name} done! item-->:{item}')
        time.sleep(2)


if __name__ == '__main__':
    q = queue.Queue()
    t1 = threading.Thread(target=producer, args=(q,))
    t2 = threading.Thread(target=consumer, args=(q,))
    t1.start()
    t2.start()
    t1.join()
    t2.join()

运行结果:
在这里插入图片描述
这里的代码使用了线程来模拟生产者和消费者,并且生产者和消费者都是边放数据边取数据,因此可以看到数据的生产和消费是交替进行的。

具体的使用需要更具不同的业务场景来选择使用的方式

以上就是Python - 队列【queue】task_done()和join()基本使用的介绍,感谢阅读,希望对你有所帮助!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】 树和二叉树概念

1.树概念及结构 树概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点,…

Android lint配置及使用

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、将 lint 配置为不显示警告3.1 在 A…

Hadoop的第三大组成:YARN框架

Hadoop的第三大组成--YARN框架 一、YARN基本概念二、YARN的基本架构组成1、ResourceManager:YARN集群的管理者2、NodeManager3、Container4、ApplicationMaster 三、YARN的详细工作流程--运行MapReduce四、YARN的资源调度器问题五、YARN的web网站问题 一、YARN基本概…

数字展厅有什么优势,一文了解数字展厅建设方案

引言: 在当今数字化风潮的席卷下,企业们正积极寻求创新的方式来吸引和互动他们的客户。数字展厅作为一种新型的虚拟宣传工具,已经开始引起广泛的关注。 一.什么是数字展厅? 数字展厅是一种基于虚拟现实(V…

C++数据结构类的自实现,封装栈,循环队列

my_Queue.h #ifndef MY_QUEUE_H #define MY_QUEUE_Hclass My_Queue { private:int* m_queue; //队列空间指针int front; //队头int tail; //队尾int m_length; //队列长度public://构造函数My_Queue(int len);//构造拷贝函数My_Queue(const My_Queue& obj);//队列长度in…

“构建高效的SpringMVC增删改查应用“

目录 引言1.配置SpringMVCpom.xmlweb.xmlzking.tldgeneratorConfig.xmljdbc.propertieslog4j2.xmlspring-context.xmlspring-mvc.xmlspring-mybatis.xmlStudentBizImplPagerAspectPageTag 2.实现代码功能StudentController 3.JSP页面代码List.jspedit.jspheard.jsp 4. 运行截图…

Linux--进程--进程-父进程退出

1.进程退出函数 进程退出分为正常退出&异常退出 正常退出: 1、main函数调用return 2、进程调用exit(),标准c库 3、进程调用_exit()或者_Exit(),属于系统调用 补充 1、进程最后一个线程返回 2、最后一个线程调用pthread_exit 异常退出: 1、调用abo…

十九、MySQL外键删除更新行为如何实现?

1、行为约束 (1)基础概念: 要学习外键约束,就要先了解外键约束。 比如说,现在这里有两张表,其中一张存储着用户的信息(子表),另外一张存储着用户所属的部门(父表) ,但现在…

c++的引用和指针

我们要清楚的知道,使用指针和引用都可以的传入函数的main函数的变量在局部函数改变值时,main函数里面相应的变量也会改变值。但他俩的方式不同。 我们先来说指针,指针传入局部参数时,他会在创建个局部指针变量,然后把…

UMA 2 - Unity Multipurpose Avatar☀️一.让UMA角色动起来

文章目录 🟥 项目基础配置1️⃣UMA_DCS 预制体2️⃣创建 UMA 角色🟧 让UMA动起来1️⃣ 新建空场景,添加UMA_DCS预制体2️⃣配置 vBasicController_Template🟥 项目基础配置 1️⃣UMA_DCS 预制体 将 UMA_DCS 预制体放到场景中 2️⃣创建 UMA 角色 创建空物体,添加 Dy…

C++编译静态成员函数报错: “osgGA::DriveManipulator::setEye”: 非静态成员函数的非法调用

来看代码 .h文件中 static void computePosition(const osg::Vec3d& eye,const osg::Vec3d& lv,const osg::Vec3d& up); void setEye(const osg::Vec3d& eye); void setRotation( const osg::Quat& rotation );osg::Vec3d _eye; osg::Quat _rotation…

Sentinel 部署 配置

目录 概述什么是 SentinelSentinel的特性hystrix与sentinel的区别Sentinel客户端Sentinel服务端 下载安装服务熔断(openfeign) 1. 添加依赖2. 创建 Feign 接口3. Controller调用接口流控规则 概述测试接口准备流控规则配置 1. QPS2. 线程数3. 关联4. 链路5. Warm up&#xff0…

基于Bert+Attention+LSTM智能校园知识图谱问答推荐系统——NLP自然语言处理算法应用(含Python全部工程源码及训练模型)+数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境服务器环境 模块实现1. 构造数据集2. 识别网络3. 命名实体纠错4. 检索问题类别5. 查询结果 系统测试1. 命名实体识别网络测试2. 知识图谱问答系统整体测试 工程源代码下载其它资料下载 前言 这个项目充分利用了…

docker-compose deploy 高可用 elasticsearch TLS

文章目录 1.sysctl2. swap3. hosts4. 配置 instances.yaml5. 创建证书6. 部署7. 修改 kibanna 密码8. 清理 1.sysctl [rootgithub es_tls]# cat /etc/sysctl.conf # sysctl settings are defined through files in # /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/…

第二证券:现量和现手是什么意思?

现量和现手是证券生意领域的术语。现量通常指股票或其他证券最新成交价格对应的成交量,而现手则是指当日生意的股票或证券的总成交量。了解这些概念关于证券生意的参与者至关重要。以下我们将从多个视点深化分析现量和现手的含义。 首要,现量和现手关于…

2023高教杯数学建模1:ABC题目+初步想法

2023 ABC题目初步想法 写在最前面A题:定日镜场的优化设计问题1:建模将其抽象为数学公式问题2:固定部分参数,约束条件下的局部最优化问题可尝试方法 问题3:约束条件下的局部最优化问题附录:相关计算公式参考…

Mac系统,webots和pycharm联合仿真,配置问题解决方案!

项目场景: 提示:这里简述项目相关背景: 问题描述:mac系统下,webots和pycharm 联合仿真,适配问题 问题描述 提示:这里描述项目中遇到的问题: 换mac电脑了,需要用到web…

4K超高清飞行箱(EFP)制作系统

EFP(Electronic Field Production)是一种节目现场制作方式,它将音视频设备集成在不同规格的标准飞行箱内,并将其运送至现场进行节目制作。与电视台演播室和大型转播车相比,箱载EFP系统具有操作方便、灵活部署、便携运输…

SpringMvc--CRUD

目录 一.什么是SpringMvc--CRUD 二.前期准备 公共页面跳转(专门用来处理页面跳转) 三.ssm之CRUD后端实现 配置pom.xml 双击mybatis-generator:generate自动生成mapper 编写generatorConfig.xml 项目结构 编写PagerAspect切面类 编写hpjyBiz接口类 编写hpjyBizImpl接…

如何使用Docker部署debezium来监控 MySQL 数据库

目录 一、什么是Docker 二、什么是debezium 三、什么是MySQL 四、如何使用Docker部署debezium来监控 MySQL 数据库 一、什么是Docker Docker是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流…