当前位置: 首页 > news >正文

Flink TaskManager详解

1. TaskManager 概述

Apache Flink 的 TaskManager 是作业执行的核心工作节点,负责实际的数据处理任务。它与 JobManager 协同工作,接受其调度指令,管理本地资源(如 CPU、内存、网络),并执行具体的算子(Operator)逻辑。TaskManager 的性能和配置直接影响作业的吞吐量、延迟和稳定性。本文将深入解析 TaskManager 的架构、核心功能及其优化实践。


2. TaskManager 架构与核心组件

TaskManager 是一个多线程的 JVM 进程,内部由多个子模块组成,共同完成资源管理、任务执行和数据交换。

2.1 核心组件
  1. Task Slot

    • Slot 是 TaskManager 的最小资源单元,每个 Slot 可运行一个 Task(即算子的并行实例)。
    • 通过 taskmanager.numberOfTaskSlots 配置 Slot 数量。例如,4 核 CPU 的机器可配置 4 个 Slot,每个 Slot 使用 1 核。
    • Slot 共享:允许同一作业的不同算子(如 Map 和 Filter)共享一个 Slot,减少资源浪费。
  2. Task

    • 算子的并行实例,例如一个并行度为 5 的 Map 算子会被拆分为 5 个 Task。
    • 每个 Task 绑定到一个 Slot 中运行,包含用户代码逻辑和状态数据。
  3. Network Stack

    • 负责 Task 之间的数据传输(Shuffle、Broadcast 等)。
    • 基于 Netty 实现,使用内存缓冲区(Network Buffer)减少序列化开销。
    • 关键配置:
      • taskmanager.network.memory.buffers-per-channel:每个通道的缓冲区数量。
      • taskmanager.memory.segment-size:缓冲区块大小(默认 32KB)。
  4. Memory Manager

    • 管理 TaskManager 的内存分配,包括:
      • 堆内内存(On-Heap):JVM 堆内存,用于用户代码和部分 Flink 运行时。
      • 堆外内存(Off-Heap):直接内存,用于网络缓冲、RocksDB 状态存储等。
    • 通过 taskmanager.memory.process.size 设置总内存,Flink 自动划分各区域。
  5. I/O Manager

    • 处理磁盘 I/O,例如 Checkpoint 写入 HDFS/S3,或 RocksDB 状态后端的本地磁盘交互。
  6. 心跳机制

    • 定期向 JobManager 发送心跳信号,汇报 Slot 状态和 Task 运行情况。
    • 心跳超时会导致 TaskManager 被标记为失效,触发作业恢复。
2.2 组件交互流程
  1. 任务部署
    • JobManager 将 Task 分配给 TaskManager 的 Slot。
    • TaskManager 加载 Task 的代码(通过类加载器),初始化算子和状态。
  2. 数据处理
    • Task 从上游读取数据(如 Kafka Source),处理后将结果写入下游(如 Kafka Sink)。
    • 网络栈负责跨 TaskManager 的数据传输。
  3. Checkpoint 执行
    • TaskManager 接收 JobManager 的 Checkpoint 触发指令,将状态快照写入持久化存储。
  4. 故障恢复
    • 当 Task 失败时,TaskManager 通知 JobManager,触发从 Checkpoint 恢复。

3. 资源管理

TaskManager 的资源分配直接影响作业性能和集群稳定性。

3.1 内存模型

TaskManager 的内存分为多个区域:

  • JVM 堆内存:存储用户代码对象、Flink 运行时数据结构。
  • 堆外内存
    • Network Buffers:用于网络数据传输(占堆外内存的 10%)。
    • Managed Memory:用于排序、哈希表、RocksDB 状态后端(默认占堆外内存的 40%)。
  • JVM Metaspace:类元数据(通过 -XX:MaxMetaspaceSize 配置)。

配置示例(flink-conf.yaml):

taskmanager.memory.process.size: 4096m  # 总内存 4GB
taskmanager.memory.managed.size: 1024m  # 托管内存 1GB
taskmanager.numberOfTaskSlots: 4        # 4 个 Slot
3.2 Slot 分配策略
  • 静态 Slot:固定数量的 Slot,适用于资源稳定的集群。
  • 动态 Slot:在 Kubernetes/YARN 上按需启动 TaskManager,实现弹性扩缩容。
3.3 资源隔离
  • CPU 隔离:通过 CGroup(Linux)或 Kubernetes 资源限制绑定 CPU 核。
  • 内存隔离:避免多个 Slot 竞争同一 TaskManager 的内存,导致 OOM。

4. 任务执行与数据交换

TaskManager 的核心职责是高效执行 Task 并管理数据传输。

4.1 Task 生命周期
  1. 初始化:加载用户代码,初始化状态后端(如 RocksDB)。
  2. 运行:处理数据流,触发定时器(如窗口计算),执行用户自定义函数(UDF)。
  3. 终止:正常结束(所有数据处理完成)或异常终止(失败时重启)。
4.2 数据交换模式
  • Forward:一对一传输,上下游 Task 在同一 TaskManager 时直接传递。
  • Hash/Range Shuffle:按 Key 分区,跨 TaskManager 传输。
  • Broadcast:将数据广播到所有下游 Task。
4.3 反压(Backpressure)处理
  • 现象:下游处理速度低于上游生产速度,导致数据堆积。
  • 检测:通过 Web UI 或 metrics.reporter.promgateway.class 监控反压。
  • 解决
    • 优化算子逻辑(如避免阻塞调用)。
    • 增加并行度或调整资源分配。
    • 增大网络缓冲区(taskmanager.network.memory.buffers-per-channel)。

5. 容错与状态管理

TaskManager 通过 Checkpoint 机制实现故障恢复和状态一致性。

5.1 Checkpoint 执行流程
  1. 触发:JobManager 的 Checkpoint Coordinator 定期发起 Checkpoint。
  2. Barrier 对齐:Task 接收到 Barrier 后暂停处理,将状态快照写入存储(如 HDFS)。
  3. 确认完成:TaskManager 向 JobManager 发送 Checkpoint 完成信号。
5.2 状态后端(State Backend)
  • MemoryStateBackend:状态存储在堆内存,仅适合测试环境。
  • FsStateBackend:状态存储在文件系统(如 HDFS),元数据在堆内存。
  • RocksDBStateBackend:状态存储在本地 RocksDB,适合大规模状态。

配置示例:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(new RocksDBStateBackend("hdfs:///checkpoints/"));
5.3 本地恢复(Local Recovery)
  • 功能:TaskManager 故障后,优先从本地磁盘恢复状态,减少网络传输。
  • 配置
    state.backend.local-recovery: true
    

6. 监控与调优

TaskManager 的监控和调优是保障作业稳定性的关键。

6.1 关键监控指标
  • CPU 使用率:通过 CPU_USAGE 指标监控是否过载。
  • 内存使用:关注 HEAP_USEDNON_HEAP_USEDDIRECT_MEMORY_USED
  • 网络吞吐量numBytesInLocalnumBytesInRemote 反映跨节点数据传输量。
  • Checkpoint 统计lastCheckpointDurationlastCheckpointSize 监控状态大小。
6.2 调优实践
  1. 内存优化
    • 增大托管内存(taskmanager.memory.managed.size)以提升 RocksDB 性能。
    • 减少 JVM 堆内存以避免 Full GC。
  2. 并行度调整
    • 根据数据量调整算子并行度,避免单个 Task 过载。
    • 使用 setParallelism() 动态设置并行度。
  3. 网络优化
    • 增大 taskmanager.network.memory.buffers-per-channel 减少反压。
    • 启用 SSL 加密(security.ssl.enabled: true)保障数据传输安全。
  4. 状态后端优化
    • 使用 RocksDB 并启用增量 Checkpoint(state.backend.incremental: true)。
    • 调整 RocksDB 的 Block Cache 和 Write Buffer 大小。
6.3 日志与问题排查
  • 日志位置:默认在 $FLINK_HOME/log/ 目录下。
  • 常见问题
    • OOM 错误:增大总内存或减少 Slot 数量。
    • Task 卡住:检查用户代码中的死锁或外部依赖(如数据库连接超时)。
    • Checkpoint 失败:优化状态大小或增大超时时间(checkpoint.timeout)。

7. 生产实践与部署模式

TaskManager 的部署模式需根据集群环境选择。

7.1 部署模式
  • Standalone:手动启动 TaskManager,适合小规模测试。
  • YARN:动态申请容器,按需启动 TaskManager。
  • Kubernetes:通过 Deployment 管理 Pod,支持弹性扩缩容。
7.2 高可用配置
  • TaskManager 容错
    • 在 HA 模式下,TaskManager 失败后由 ResourceManager 重新调度到其他节点。
    • 启用 ZooKeeper 持久化元数据(与 JobManager HA 配合使用)。
7.3 升级与维护
  • 滚动升级:在 Kubernetes 上逐步替换 TaskManager Pod,减少作业中断。
  • 资源回收:通过 taskmanager.slot.idle.timeout 释放闲置 Slot。

8. 总结

TaskManager 是 Flink 作业执行的“肌肉”,其设计兼顾了高性能、资源隔离和容错能力。深入理解其内存管理、任务调度和状态持久化机制,能够有效优化作业吞吐量、降低延迟,并提升集群稳定性。在实际生产中,结合监控指标和调优实践,合理配置 TaskManager 参数,是构建高效实时数据处理管道的关键步骤。

相关文章:

Flink TaskManager详解

1. TaskManager 概述 Apache Flink 的 TaskManager 是作业执行的核心工作节点,负责实际的数据处理任务。它与 JobManager 协同工作,接受其调度指令,管理本地资源(如 CPU、内存、网络),并执行具体的算子&am…...

Docker安装(Ubuntu22版)

前言 你是否还在为Linux上配置Docker而感到烦恼? 你是否还在为docker search,docker pull连接不上,而感到沮丧? 本文将解决以上你的所有烦恼!快速安装好docker! Docker安装 首先,我们得先卸载…...

《深入浅出ProtoBuf:从环境搭建到高效数据序列化》​

ProtoBuf详解 1、初识ProtoBuf2、安装ProtoBuf2.1、ProtoBuf在Windows下的安装2.2、ProtoBuf在Linux下的安装 3、快速上手——通讯录V1.03.1、步骤1:创建.proto文件3.2、步骤2:编译contacts.proto文件,生成C文件3.3、步骤3:序列化…...

【含文档+PPT+源码】基于微信小程序连锁药店商城

项目介绍 本课程演示的是一款基于微信小程序连锁药店商城,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附带的…...

再见,物理删除!MyBatis-Plus @TableLogic 优雅实现逻辑删除

在开发应用程序时,我们经常会遇到需要删除数据的场景。但直接从数据库中物理删除(DELETE​)数据有时并非最佳选择。为什么呢? 数据恢复: 一旦物理删除,数据通常难以恢复,误操作可能导致灾难性后果。审计追…...

uni-app中获取用户实时位置完整指南:解决权限报错问题

uni-app中获取用户实时位置完整指南:解决权限报错问题 在uni-app开发运行在微信小程序时,获取用户位置信息是一个常见的需求,无论是用于地图导航、附近推荐还是其他基于位置的服务。然而,许多开发者在调用位置相关API时会遇到各种…...

【AI插件开发】Notepad++ AI插件开发1.0发布和使用说明

一、产品简介 AiCoder是一款为Notepad设计的轻量级AI辅助插件,提供以下核心功能: 嵌入式提问:对选中的文本内容进行AI分析,通过侧边栏聊天界面与AI交互,实现多轮对话、问题解答或代码生成。对话式提问:独…...

UnityEditor - 调用编辑器菜单功能

例如: 调用Edit/Frame Selected In Scene EditorApplication.ExecuteMenuItem("Edit/Frame Selected in Scene"); EditorApplication.ExecuteMenuItem("Edit/Lock view to Selected");...

OpenHarmony - 小型系统内核(LiteOS-A)(十),魔法键使用方法,用户态异常信息说明

OpenHarmony - 小型系统内核(LiteOS-A)(十) 十四、魔法键使用方法 使用场景 在系统运行出现无响应等情况时,可以通过魔法键功能确定系统是否被锁中断(魔法键也无响应)或者查看系统任务运行状态…...

在 Vue3 中封装的 Axios 实例中,若需要为部分接口提供手动取消请求的功能

核心思路 封装接口时返回 Promise 和 abort 方法: 为需要支持取消的接口返回一个对象,包含 promise 和 abort 方法,用户可通过 abort 主动中断请求。使用 AbortController 或 CancelToken: 推荐 AbortController(浏览…...

QuecPython+audio:实现音频的录制与播放

概述 QuecPython 作为专为物联网设计的开发框架,通过高度封装的 Python 接口为嵌入式设备提供了完整的音频处理能力。本文主要介绍如何利用 QuecPython 快速实现音频功能的开发。 核心优势 极简开发:3行代码完成基础音频录制与播放。快速上手&#xf…...

Langchain入门介绍

[声明] 本文参考:Langchain官方文档 什么是LangChain? LangChain 是一个开源的、用于开发由大型语言模型 (LLM) 驱动的应用程序的框架。它的核心目标是将强大的 LLM(如 GPT-4, Claude, Llama 等)与外部数据源、计算资源和工具连接起来,从…...

WebUI可视化:第4章:Streamlit数据可视化实战

学习目标 ✅ 掌握Streamlit的安装与基础配置 ✅ 能够创建数据驱动的交互式界面 ✅ 实现常见图表(折线图、柱状图等)的绘制 ✅ 开发完整的业务数据分析应用 4.1 Streamlit快速入门 4.1.1 环境安装 打开终端执行: bash pip install streamlit 验证安装: bash stream…...

3.4 Spring Boot异常处理

本实战项目通过Spring Boot实现了一个简单的用户信息查询功能,并展示了如何自定义异常处理机制。项目中创建了用户实体类User和用户控制器UserController,在控制器中通过isValidUserId方法校验用户ID是否有效,若无效则抛出自定义异常InvalidU…...

期货有哪些种类?什么是股指、利率和外汇期货?

期货主要可以分成两大类:商品期货和金融期货。商品期货,顾名思义,就是跟实物商品有关的期货,比如农产品、金属、能源这些。金融期货呢,就是跟金融产品有关的期货,比如外汇、利率、股票指数这些。 一、商品…...

Golang | 位运算

位运算比常规运算快,常用于搜索引擎的筛选功能。例如,数字除以二等价于向右移位,位移运算比除法快。...

[论文阅读]ReAct: Synergizing Reasoning and Acting in Language Models

ReAct: Synergizing Reasoning and Acting in Language Models [2210.03629] ReAct: Synergizing Reasoning and Acting in Language Models ICLR 2023 这是一篇在2022年挂出来的论文,不要以现在更加强大且性能综合的LLM来对这篇文章进行批判。 思想来源于作者对…...

拥有600+门店的宠物连锁医院,实现核心业务系统上云

瑞派宠物医院管理股份有限公司(以下简称“瑞派宠物“)从2017年开始数字化转型之路。瑞派宠物在全国有600连锁门店,随着业务量增加,线下部署的财务系统存在设备老旧、机房环境差等问题,部分在公有云上的业务&#xff0c…...

OceanBase 跻身 Forrester 三大领域代表厂商,全面支撑AI场景

在生成式AI迅猛发展的当下,智能化数据管理已成为企业提升数字化水平、优化运营效率和强化市场竞争优势的战略重点。Forrester 最新发布的《2025年中国数据管理生态系统趋势报告》中,OceanBase凭借原生分布式架构和一体化产品优势,入选 全局数…...

学生管理系统微服务方式实现

//不用这种方式实现也可以,用这种方式是为了房间我们理解微服务的实现方式 微服务的实现方式就是把一个单项目应用的不同功能封装成单独的项目,然后向外暴露一个接口以便调用。如果需要这个功能我们直接调用这个功能对应项目的接口就可以了 服务之间的…...

OpenAI最新的4o图像生成模型 gpt-image-1 深度解析:API KEY 获取、开发代码示例

1. 引言 近期,OpenAI 正式发布了其最新的图像生成 API,模型标识符为 gpt-image-1。这一重要发布,首次将先前在 ChatGPT 中通过 GPT-4o 模型驱动、备受用户欢迎的先进图像生成能力,以编程接口(API)的形式提…...

NAT穿透

NAT是 Net Address Traslation的缩写,即网络地址转换 NAT部署在网络出口的位置。位于内网和公网之间,是连接内挖个主机和公网的桥梁,双向流量都必须经过NAT,装有NAT软件的路由器叫NAT路由器,NAT路由器拥有公网Ip NAT解…...

人工智能与机器学习:Python从零实现性回归模型

🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...

FreeRTOS

FreeRTOS任务调度的三种方式: 抢占式调度 针对优先级不同的任务 时间片调度 针对优先级相同的任务; FreeRTOS中的一个时间片就等于SysTick(滴答定时器)中断周期(1ms); 协程式调度 后续将不再支持。 …...

PCI 总线学习笔记(五)

PCI 总线学习系列,参考自 技术大牛博客: PCIe 扫盲系列博文连载目录篇 书籍:王齐老师的《PCI Express 体系结构导读》 下面的文章中加入了自己的一些理解和实际使用中遇到的一些场景,供日后查询和回忆使用 PCI 总线定义了两类配置…...

PyTorch与CUDA的关系

文章目录 前言一、如何查看PyTorch和torchvision的版本1.1 查看PyTorch版本1.2 查看torchvision版本二、如何确认PyTorch和torchvision是否支持CUDA加速2.1 检查PyTorch是否支持CUDA2.2 查看当前可用的GPU设备2.3 检查torchvision是否支持CUDA三、CUDA版本的秘密:为什么PyTorc…...

网络中断事件进行根因分析(RCA)

网络中断事件的根因分析(RCA)详解 根因分析(Root Cause Analysis, RCA)是网络运维中用于定位和解决故障的核心方法,目标是找到问题的根本原因,避免重复发生。以下是完整的RCA流程和方法: 1. RC…...

Mac中 “XX”文件已损坏,无法打开 解决方案

前言 Mac中打开软件 出现“XX”文件已损坏,无法打开的提示 怎么处理? 操作总结 1、查看当前 Gatekeeper 是否启用 spctl --status2、完全关闭 Gatekeeper(允许安装任何来源应用) sudo spctl --master-disable3、打开“系统设…...

如何通过python连接hive,并对里面的表进行增删改查操作

要通过Python连接Hive并对其中的表进行增删改查操作,可以使用pyhive库。下面是一个简单的示例代码,演示如何连接Hive并执行一些操作: from pyhive import hive# 建立连接 conn hive.connect(hostyour_hive_host, port10000, authNOSASL)# 创…...

对Mac文字双击或三击鼠标左键没有任何反应

目录 项目场景: 问题描述 原因分析: 解决方案: 项目场景: 在使用Mac系统的时候,使用Apple无线鼠标,双击左键能够选取某个单词或词语,三击左键能够选取某一行,(百度、…...

【维护窗口内最值+单调队列/优先队列】Leetcode 239. 滑动窗口最大值

题目要求 给定一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。滑动窗口每次只向右移动一位。要求返回滑动窗口中的最大值。 示例 1 输入:nums [1,3,-1,-3,5,3,6,7], k 3 输出:[3,3,5,5,6,7] 解释&#…...

【Leetcode 每日一题】2845. 统计趣味子数组的数目

问题背景 给你一个下标从 0 0 0 开始的整数数组 n u m s nums nums,以及整数 m o d u l o modulo modulo 和整数 k k k。 请你找出并统计数组中 趣味子数组 的数目。 如果 子数组 n u m s [ l . . r ] nums[l..r] nums[l..r] 满足下述条件,则称其为…...

SDC命令详解:使用get_cells命令进行查询

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 get_cells命令用于创建一个单元对象集合,关于设计对象和集合的更详细介绍,可以参考下面的博客。 Synopsys:设计对象https://c…...

正则表达式及其游戏中应用

一、正则表达式基础知识 ✅ 什么是正则表达式? 正则表达式是一种用来匹配字符串的规则表达式,常用于搜索、验证、替换等文本处理场景。 比如你想找出玩家输入中的邮箱、命令、作弊码……正则就特别好用。 📚 常见语法速查表: …...

如何在 MinGW 和 Visual Studio (MSVC) 之间共享 DLL

如何在 MinGW 和 Visual Studio (MSVC) 之间共享 DLL ✅ .dll.a 和 .lib 是什么? 1. .dll.a(MinGW 下的 import library) 作用:链接时告诉编译器如何调用 DLL 中的函数。谁用它:MinGW 编译器(如 g&#x…...

【HTTP/2和HTTP/3的应用现状:看不见的革命】

HTTP/2和HTTP/3的应用现状:看不见的革命 实际上,HTTP/2和HTTP/3已经被众多著名网站广泛采用,只是这场革命对普通用户来说是"无形"的。让我们揭开这个技术变革的真相。 著名网站的HTTP/2和HTTP/3采用情况 #mermaid-svg-MtfrNDo5DG…...

ts中null类型--结合在vue中的使用、tsconfig.json

总结 TypeScript 中的 null 是一个独立的类型,用于明确表示“无值”或“空值”。在实际开发中,常通过联合类型(如 string | null)或与 ref 结合使用,确保代码的类型安全和可读性。 详情解释 在 TypeScript 中,null 是一个独立的类型,表示 null 值本身。以下是一些关于…...

Hadoop生态圈框架部署 - Windows上部署Hadoop

文章目录 前言一、下载Hadoop安装包及bin目录1. 下载Hadoop安装包2. 下载Hadoop的bin目录 二、安装Hadoop1. 解压Hadoop安装包2. 解压Hadoop的Windows工具包 三、配置Hadoop1. 配置Hadoop环境变量1.1 打开系统属性设置1.2 配置环境变量1.3 验证环境变量是否配置成功 2. 修改Had…...

深度学习笔记22-RNN心脏病预测(Tensorflow)

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 一、前期准备 1.导入数据 import tensorflow as tf import pandas as pd import numpy as np dfpd.read_csv("E:/heart.csv") df 2.检查数据是否有…...

面试踩过的坑

1、 “”和equals 的区别 “”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重…...

【机器学习速记】面试重点/期末考试

自用,有错误欢迎评论区指出 目录 一、机器学习基础概念 二、机器学习类型分类 三、经典算法与原理 1. 线性模型 2. 决策树 3. SVM(支持向量机) 4. K近邻(KNN) 5. 贝叶斯分类 6. 集成学习 四、模型评价指标 五、模型泛化能力与调参 六、特征工程与数据预处理 七、维…...

Cursor如何手动添加多个大模型?

笔者在前面的文章Cursor接入API: deepseekV3(免费)_cursor api-CSDN博客中介绍了如何添加deepseek到Cursor中,如果要添加其他大模型,比如阿里的通义千问qwen-max-2025-01-25等,方法一样,在官方网站找到模型名称和base_url&#xf…...

FerretDB:基于PostgreSQL的MongoDB替代产品

FerretDB 是一种基于NoSQL的分布式数据库,它旨在通过优化存储和查询机制来提供卓越的性能和可靠性。它支持水平扩展和高并发访问,并提供灵活的数据模型,使开发人员能够轻松地存储和检索各种类型的数据。 Stars 数10,057Forks 数439 主要特点…...

JDBC 批处理与事务处理:提升数据操作效率与一致性的密钥

目录 一. JDBC批量添加数据 1. 什么是批量添加数据 2. 实现数据的批量添加 a. 方式一:不分块 二. JDBC事务处理 1. 什么是事务 2. JDBC事务处理实现 三. 总结 前言 本文来讲解JDBC的批处理和事务处理 这对数据的安全性和准确性以及高效率提供很好的办法 话不…...

vue2实现Blod文件流下载

实现思路: 动态创建一个a标签,模拟点击打开链接,实现下载 downLoad() { //调用下载接口Export({Id: id}).then(res > {this.showLoading false;if (res && res.data && res.data.returnCode -1) {this.msgError(res.d…...

js数据结构之栈

JavaScript数据结构 一、什么是数据结构? 数据结构是向相互之间存在一种或者多种特定关系的数据组成的集合, 采用合适的数据结构能给开发者提高开发和储存效率.比如我们在学习Es6中的我们新接触的到的(Set, map), 在合适的时候使用它们能帮助我们更快的的解决问题. 我们每个在…...

[Windows] 卡巴斯基Kaspersky 21.21.7.384 免费版

卡巴斯基免费版从界面到功能和使用体验来说,简洁、高效、严苛、轻巧,可以“弥补”火绒杀毒能力不强,同时也不会像 Microsoft Defender 误报。 链接1:https://pan.xunlei.com/s/VOOhFEeznr_4W6s7-XT8IwN-A1?pwdztn4# 链接2&…...

【HFP】蓝牙HFP协议中音频连接转移与拨号功能的深度解析

目录 一、核心功能矩阵 二、音频连接向 HF 转移 2.1 转移概述 2.2 前提条件 2.3 适用情况 2.4 转移流程 2.5 注意事项 2.6 示例图 三、音频连接向 AG 转移 3.1 转移概述 3.2 前提条件 3.3 特殊情况处理 3.4 转移流程 3.5 注意事项 3.6 示例图 四、通过HF提供号…...

Android学习总结之Glide篇(缓存和生命周期)

一、Glide缓存 1. 内存缓存 内存缓存主要包含活动资源缓存与 LRU 内存缓存这两个级别。 活动资源缓存(Active Resources) 作用:用于存放当前正在被显示的图片资源。当某张图片正展示在 ImageView 上时,它会被纳入活动资源缓存…...

Python 快速获取Excel工作表名称

文章目录 前言准备工作Python 获取Excel中所有工作表的名称Python 获取Excel中隐藏工作表的名称 前言 在数据分析与办公自动化领域,通过Python处理Excel文件已成为必备技能。通过获取工作表名称,我们可以: 快速了解文件结构自动化处理多工作…...