【操作系统】为什么在Windows系统上tqdm跟print函数两者不是同步输出的呢?

1 问题描述

今天在学习tqdm的时候,遇到一个问题,就是我发现trange的输出跟主线程的print函数不是同步输出的
我使用的测试代码如下:

import sysfrom tqdm import trangedef main():X = 100for i in trange(X):# for i in trange(X, file=sys.stdout):print(i)for j in range(X):print(j)k = j * iprint("Done🛠️")return 0if __name__ == '__main__':main()

控制台的输出如下:

# 输出信息很多,这里就只给出了最后几行信息
...
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
Done🛠️
100%|██████████| 100/100 [00:00<00:00, 3694.12it/s]Process finished with exit code 0

可以看到100%|██████████| 100/100 [00:00<00:00, 3694.12it/s]信息竟然是在Done🛠️之后才输出的,这让我们感觉很奇怪;

2 假设和猜测

(1)猜测:tqdm在其底层实现中是使用子线程进行进度条的打印输出的

也就是,进度条的打印输出是异步进行的,所以才会出现【100%|██████████| 100/100 [00:00<00:00,...]进度条信息在Done🛠️】之后输出的情况;

(2)猜测:tqdm的进度条刷新也是通过end='\r'的设置实现的

我们如此猜测,是因为如果在中途进行print输出的话,就会重复显示进度条;我们使用了如下代码来进行测试:

import sys
from tqdm import trangedef main():X = 10k = 0for i in trange(X, file=sys.stderr):  # 使用默认的stderr输出print(f"Outer loop {i}")for j in range(2000000):k += j * iprint(f"Done🛠️: k = {k}")return 0if __name__ == '__main__':main()

其输出信息如下:

  0%|          | 0/10 [00:00<?, ?it/s]Outer loop 0
Outer loop 120%|██        | 2/10 [00:00<00:00, 11.00it/s]Outer loop 2
Outer loop 340%|████      | 4/10 [00:00<00:00, 10.02it/s]Outer loop 4
Outer loop 560%|██████    | 6/10 [00:00<00:00,  9.67it/s]Outer loop 670%|███████   | 7/10 [00:00<00:00,  9.52it/s]Outer loop 7
Outer loop 890%|█████████ | 9/10 [00:00<00:00,  9.32it/s]Outer loop 9
100%|██████████| 10/10 [00:01<00:00,  9.53it/s]
Done🛠️: k = 89999955000000Process finished with exit code 0

可以看到中途会出现循环过程中的进度条信息;

3 提问备忘

【StackOverflow】Understanding Threading Behavior in tqdm for Progress Bar Updates

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

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

相关文章

网易和腾讯面试题精选---API 设计和开发面试问答

介绍 API 设计和开发是不断发展的软件工程领域的关键组成部分。随着企业越来越依赖互连系统,创建强大、高效和用户友好的 API 的能力已成为科技行业抢手的技能。无论您是经验丰富的 API 开发人员还是准备面试的候选人,掌握 API 设计的复杂性都是至关重要的。本文深入探讨了一…

基于Springboot的兼职网(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的兼职网&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0…

《动手学深度学习(PyTorch版)》笔记7.2

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

阿里云入门

阿里云是阿里巴巴集团提供的云计算服务平台&#xff0c;提供各种云服务&#xff0c;包括计算、存储、网络、数据库、安全等。以下是阿里云入门的一些建议步骤&#xff1a; ### 1. **注册阿里云账号&#xff1a;** - 访问 [阿里云官方网站](https://www.aliyun.com/)&#x…

DevOps落地笔记-14|部署流水线:打造一站式部署的关键平台

上一课时我主要介绍了实现自动化测试的范围、流程和结构图&#xff0c;自动化测试是持续集成实践不可或缺的一部分&#xff0c;从而使得软件向高效率和高质量迈进了一大步。持续集成主要关注的是代码是否可以编译成功、是否可以通过单元测试和验收测试等。但持续集成并不能实现…

HubSpot营销自动化如何优化营销流程?

HubSpot营销自动化在优化营销流程、减少手动工作以及提高效率方面发挥着关键作用。以下是一些具体的方法和策略&#xff1a; 1. 自动化电子邮件营销&#xff1a; 利用HubSpot的电子邮件自动化功能&#xff0c;设置触发条件&#xff0c;使邮件发送根据用户行为或阶段自动进行。…

Spark 依赖包加载方式

1 Spark 依赖包来源 我们知道Spark application运行加载依赖有三个地方&#xff1a; systemClasspath&#xff1a;Spark安装时候提供的依赖包&#xff0c;${SPARK_HOME}/jars下的包。spark-submit --jars 提交的依赖包spark-submit --config "spark.{driver/executor}.e…

Java SPI 代码示例

Java Service Provider Interface 是JDK自带的服务提供者接口又叫服务发现机制更是一种面向接口的设计思想。即JDK本身提供接口类&#xff0c; 第三方实现其接口&#xff0c;并作为jar包或其他方式注入到其中&#xff0c; 在运行时会被JDK ServiceLoader 发现并加载&#xff0c…

gd32F470配置CAN通信

can.c #include "can.h"can_trasnmit_message_struct transmit_message;//传入参数为0,则初始化CAN0的GPIO引脚&#xff1b;传入参数为1,则初始化CAN1的GPIO引脚 void CanGpioInit(void) {/* enable can clock */rcu_periph_clock_enable(RCU_CAN0);rcu_periph_cloc…

最大子数组(c++题解)

题目描述 题目描述 给你一个长度为 的整数数组 。 求长度为 的 的连续子数组 中 的最大值。 连续子数组定义&#xff1a; 一个数列的连续子数组是指从原数组中连续若干个元素组成的子数组。 例如&#xff0c;和是的连续子数组&#xff0c;但和不是的连续子数组。 输…

【Golang】自定义logrus日志保存为日志文件

背景 为了方便查看日志&#xff0c;项目中需要把日志保存到对应的日志文件中&#xff0c;所以需要当前的配置&#xff0c;以使得日志能够保存到对应的日志文件中。 代码 import ("github.com/orandin/lumberjackrus""github.com/sirupsen/logrus" )func …

骨传导是表示啥?骨传导耳机有什么优势

最近市场上兴起了一股骨传导耳机的热潮&#xff0c;它引起了广泛的关注并带来了许多用户的好奇&#xff1a;骨传导是表示啥&#xff1f;骨传导耳机有什么优势&#xff1f;接下来我们将深入探讨骨传导是表示啥以及骨传导耳机有什么优势。 骨传导是表示啥 简而言之&#xff0c;骨…

[office] Excel表格中画出对角线打字的操作方法 #微信#知识分享

Excel表格中画出对角线打字的操作方法 Excel单元格中加斜线非常的简单&#xff0c;但如何在加斜线的单元格内打字却成了一大难题&#xff0c;既要设置好文字位置&#xff0c;又要利用Alt回车键进行换行。今天&#xff0c;小编就教大家在Excel表格中画出对角线打字的操作方法。 …

c实现顺序表

目录 c语言实现顺序表 完整代码实现 c语言实现顺序表 顺序表的结构定义&#xff1a; typedef struct vector {int size; // 顺序表的容量int count; // 顺序表现在存储了多少个数据int *data; // 指针指向连续的整型存储空间 } vector;顺序表的结构操作&#xff1a; 1、初始化…

VSCode 安装LLDB调试器(OS X)并启动调试

插件&#xff1a;&#xff08;LLDB插件安装&#xff09; 安装这个版本不好弄错了&#xff0c;CodeLLDB&#xff08;名字&#xff09; 配置&#xff1a;&#xff08;LLDB启动调试&#xff09; {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更…

Python循环语句——while循环的嵌套应用

一、引言 在Python编程中&#xff0c;循环结构是必不可少的。其中&#xff0c;while循环因其灵活性而备受青睐。嵌套while循环&#xff0c;即将一个while循环放置在另一个while循环内部&#xff0c;能让我们编写更为复杂的程序逻辑。本文将详细介绍嵌套while循环的基本概念、使…

day32 买卖股票的最佳时机Ⅱ 跳跃游戏 跳跃游戏Ⅱ

题目1&#xff1a;122 买卖股票的最佳时机Ⅱ 题目链接&#xff1a;122 买卖股票的最大时机Ⅱ 题意 整数数组prices[i]表示某股票的第i天的价格&#xff0c;每天可买卖股票且最多持有1股股票&#xff0c;返回最大利润 利润拆分&#xff0c;拆分为每天的利润 每天的正利…

李沐《动手学深度学习》循环神经网络 经典网络模型

系列文章 李沐《动手学深度学习》预备知识 张量操作及数据处理 李沐《动手学深度学习》预备知识 线性代数及微积分 李沐《动手学深度学习》线性神经网络 线性回归 李沐《动手学深度学习》线性神经网络 softmax回归 李沐《动手学深度学习》多层感知机 模型概念和代码实现 李沐《…

从0开始搭建、上传npm包

从0开始搭建、上传npm包 1、上传一个简单获取水果价格的包创建 vite 项目在项目根目录 src 文件夹中创建 index.ts 文件&#xff0c;文件内容如下&#xff1a;在 main.ts 文件中导入、导出上面创建的方法创建 vite.config.ts 配置文件&#xff0c;文件内容如下配置 package.jso…

Matplotlib热力图的创意绘制指南【第54篇—python:Matplotlib热力图】

文章目录 Matplotlib热力图的创意绘制指南1. 简介2. 基本热力图3. 自定义颜色映射4. 添加注释5. 不同形状的热力图6. 分块热力图7. 多子图热力图8. 3D热力图9. 高级颜色映射与颜色栏设置10. 热力图的动态展示11. 热力图的交互性12. 标准化数据范围13. 导出热力图 总结&#xff…