鸿蒙开发中的并发与多线程
文章目录
- 前言
- 异步并发 (Promise和async/await)
- 多线程并发
- 并发能力选择
- 耗时任务并发执行场景
- 常见业务场景
- 常驻任务并发执行场景
- 常见业务场景
- 传统共享内存并发业务
- 长时任务并发执行场景
- 常见业务场景
- 并发任务管理
- 线程间通信
- 同语言线程间通信(ArkTS内)
- 线程间模块共享(单例模式)
- 实现方案介绍(方案二)
- 线程间不可变数据共享
- 实现方案介绍
- 生产者与消费者模式
前言
并发是指在同一时间内,存在多个任务同时执行的情况。对于多核设备,这些任务可能同时在不同CPU上并行执行。对于单核设备,多个并发任务不会在同一时刻并行执行,但是CPU会在某个任务休眠或进行I/O操作等状态下切换任务,调度执行其他任务,提升CPU的资源利用率。
异步并发 (Promise和async/await)
- Promise 的特点与用法:Promise 用于处理异步操作,有 pending、fulfilled、rejected 三种状态,通过构造函数传入 executor 函数创建 Promise 对象,executor 函数接收 resolve 和 reject 回调函数。可使用 then 和 catch 方法指定不同状态的回调函数。
- async/await 的优势:async/await 是 Promise 的语法糖,使异步代码更易读,async 函数返回 Promise 对象,内部可用 await 等待 Promise 解析,将异步操作以同步方式编写,还可结合 try/catch 捕获异常。
多线程并发
-
ArkTS并发模型:ArkTS采用内存隔离的线程模型,不同线程之间通过消息通信,线程内无锁化运行。与传统共享内存并发模型相比,
异步I/O不阻塞ArkTS线程
,TaskPool及I/O线程池由系统管理,提升能效。 -
不支持在多线程中使用AppStorage。 -
TaskPool的使用:TaskPool可执行耗时任务,提供任务分发入口,支持将任务分发到不同优先级队列,自动管理工作线程并根据任务数量扩缩容。适用于相对独立的耗时任务、长时任务,但任务执行中有通信开销、不能阻塞过长、不能有上下文依赖等限制。
-
Worker的使用:Worker可执行常驻任务,需开发者主动创建或关闭并维护其生命周期,同时运行的Worker子线程数量有限。适用于长耗时且并发量不大的常驻任务场景。
-
实现特点对比:
- 内存模型与参数传递机制:TaskPool 和 Worker 都采用线程间隔离、内存不共享的方式,且参数传递都采用结构化克隆算法,支持 ArrayBuffer 转移和 SharedArrayBuffer 共享。,开发者自行管理数量及生命周期,不支持上述 TaskPool 的其他特性。
-
适用场景对比:
- TaskPool 适用场景:大多数场景推荐使用,性能优于 Worker,适用于需要设置优先级、频繁取消任务、大量或调度点较分散任务等。
- Worker 适用场景:适用于运行时间超过 3 分钟的任务、有关联的一系列同步任务等特定场景。
场景编号 | 场景分类 | 场景名称 | 简述 |
1 | 并发能力选择 | 耗时任务并发执行 | 相对独立的耗时任务需要放到单独的子线程中执行,推荐TaskPool |
2 | 常驻任务并发执行 | 常驻的耗时任务需要放到单独的子线程中执行,推荐Worker | |
3 | 共享内存并发业务 | 开发常见的共享内存并发业务,推荐使用TaskPool和Worker的API进行开发 | |
4 | 长时任务并发执行 | 长时间运行的任务,不独占线程执行,推荐TaskPool长时任务 | |
5 | 并发任务管理 | 多任务关联执行(串行顺序依赖) | 有严格执行顺序的任务,不希望并发执行 |
6 | 多任务关联执行(树状依赖) | 待执行的任务存在依赖关系,等待被依赖执行完再调度 | |
7 | 多任务同步等待结果(任务组) | 多个关联的任务需要等待全部结果返回后再进行后续操作 | |
8 | 多任务优先级调度 | 不同任务设置不同的优先级 | |
9 | 任务延时调度 | 任务不希望立即执行,希望延时一定时间后调度 | |
10 | 线程间通信 | 同语言线程间通信(ArkTS内) | 介绍ArkTS线程间的通信机制 |
11 | 跨语言多线程通信(C++与ArkTS) | 介绍C++与ArkTS线程间的通信机制 | |
12 | 线程间模块共享(单例模式) | 介绍进程内单例场景的实现方式 | |
13 | 线程间不可变数据共享 | 介绍不可变数据共享场景的实现方式 | |
14 | 生产者与消费者模式 | 介绍生产者与消费者模式场景的实现方式 |
并发能力选择
耗时任务并发执行场景
典型的耗时任务有CPU密集型任务、I/O密集型任务以及同步任务。=>任务池(TaskPool)
对于独立的耗时任务,不建议采用Worker来实现。
import { taskpool } from '@kit.ArkTS';@Concurrent
async function foo(a: number, b: number) {return a + b;
}taskpool.execute(foo, 1, 2).then((ret: Object) => { // 结果处理console.log('Return:' + ret);
})
常见业务场景
常见业务场景 | 具体业务描述 |
---|---|
图片/视频编解码 | 将图片或视频进行编解码再展示 |
压缩/解压缩 | 对本地压缩包进行解压操作,或者本地文件的压缩操作 |
JSON解析 | 对JSON字符串的序列化和反序列化操作 |
模型运算 | 对数据进行模型运算分析等 |
网络下载 | 密集网络请求下载资源、图片、文件等 |
数据库操作 | 将聊天记录、页面布局信息、音乐列表信息等保存到数据库,或者应用二次启动时,读取数据库展示相关信息 |
常驻任务并发执行场景
常驻不是指可以在后台保活运行的任务,而是相比于短时任务,时间更长的任务,可能与主线程生命周期一致。
对于一些长耗时(大于3min)且并发量不大的常驻任务场景,使用Worker在后台线程中运行这些耗时逻辑,避免阻塞主线程而导致出现丢帧卡顿等影响用户体验性的问题 。
常驻任务不推荐作为任务分发给TaskPool。
常见业务场景
常见业务场景 | 具体业务描述 |
---|---|
游戏中台场景 | 启动子线程作为游戏业务的主逻辑线程,UI线程只负责渲染 |
产线硬件压测 | 需要阻塞调用硬件能力,做老化测试,阻塞式 |
传统共享内存并发业务
如果需要使用内存共享,当前可以通过Node-API到C++层进行共享,或者定义Sendable对象进行线程间数据共享。
长时任务并发执行场景
长时任务不同于阻塞任务,长周期运行,但是每次执行不会阻塞线程很久。因此不推荐将需要独占线程的任务封装成长时任务。任务池(TaskPool)
对于非常驻的长时任务,不建议采用Worker来实现。
长时任务指的是长时间不间断运行的独立任务,例如监听某个事件,发起执行后不会再接收发起方的输入,虽然也可以使用worker(推荐常驻后台任务才使用worker),但是更推荐使用TaskPool,TaskPool更方便,资源消耗更低。
常见业务场景
常见业务场景 | 具体业务描述 |
---|---|
定期传感器数据采集 | 周期性采集一些传感器信息(例如位置信息、速度传感器等),应用运行阶段常驻运行。 |
Socket端口信息监听 | 长时间监听Socket数据,不定时需要响应处理。 |
import { taskpool } from '@kit.ArkTS';@Concurrent
async function foo() {// 长监听等任务taskpool.Task.sendData();
}function executeTaskPool() {let longTask: taskpool.LongTask = new taskpool.LongTask(foo);longTask.onReceiveData((msg: Object) => {// 监听回调console.info(`onReceiveData, ${JSON.stringify(msg)}`);});taskpool.execute(longTask).then(() => {console.info('execute');});
}executeTaskPool();
并发任务管理
多任务关联执行(串行顺序依赖)
多任务关联执行(树状依赖)
多任务同步等待结果(任务组)
多任务优先级调度
任务延时调度
线程间通信
同语言线程间通信(ArkTS内)
跨线程交互场景 | 通信方式 | 通信优先级 |
---|---|---|
宿主JS线程->TaskPool线程 | 参数传递后分发任务;过程中不支持正向通信 | 支持 |
TaskPool线程->宿主JS线程 | 结果返回;sendData触发宿主线程异步回调,底层为uv_async_send实现 | 不支持 |
宿主JS线程->Worker线程 | 采用postMessage&onmessage异步通信 | 不支持 |
Worker线程->宿主JS线程 | 异步方式:采用postMessage & onmessage异步通信 同步方式:支持Worker线程同步调用宿主线程注册的方法,并返回结果 | 不支持 |
任意JS线程<->任意JS线程 | 使用ohos.emitter实现双向异步通信 | 支持 |
线程间模块共享(单例模式)
实现方案介绍(方案二)
步骤一:采用ArkTS对象,定义Sendable类的单例,封装成共享模块(进程内共享),子线程进行初始化;
步骤二:初始化完成通知主线程,主线程导入使用该单例对象。
线程间不可变数据共享
实现方案介绍
通过冻结API,使共享对象变成只读对象。实现方案介绍:
步骤一:业务逻辑定义、生成需要的Sendable对象;
步骤二:发送到其他ArkTS线程前通过Object.Freeze API冻结该对象;
步骤三:通过taskpool或worker的消息通信机制将该对象共享到其他ArkTS线程。
生产者与消费者模式
相关文章:
鸿蒙开发中的并发与多线程
文章目录 前言异步并发 (Promise和async/await)多线程并发并发能力选择耗时任务并发执行场景常见业务场景 常驻任务并发执行场景常见业务场景 传统共享内存并发业务长时任务并发执行场景常见业务场景 并发任务管理线程间通信同语言线程间通信(ArkTS内)线…...
ruby self
在 Ruby 中,self 是一个指向当前对象的特殊变量,它的值根据代码的上下文动态变化。理解 self 的指向是掌握 Ruby 面向对象编程的关键。以下是详细解析: 一、self 的核心规则 self 始终指向当前方法的执行者(即调用方法的对象&…...
Kotlin 学习-集合
/*** kotlin 集合* List:是一个有序列表,可通过索引(下标)访问元素。元素可以在list中出现多次、元素可重复* Set:是元素唯一的集合。一般来说 set中的元素顺序并不重要、无序集合* Map:(字典)是一组键值对。键是唯一的…...
封装方法的辨析
equals //字符串 str1.equals(str2); //list的两个实现类 list1.equals(list2); //map的两个实现类 //比较所有的键值对是否相同 map1.equals(map2); //数组(包括string类型) //比较内容是否相同 Arrays.equals(array1, array2); contains 基本都有…...
解决 IntelliJ IDEA 中 Maven 项目左侧项目视图未显示顶层目录问题的详细步骤说明
以下是解决 IntelliJ IDEA 中 Maven 项目左侧项目视图未显示顶层目录问题的详细步骤说明: 1. 切换项目视图模式 默认情况下,IDEA 的项目视图可能处于 Packages 模式,仅显示代码包结构,而非物理目录。 操作步骤: 点击…...
CMIP6数据分析与可视化、降尺度技术与气候变化的区域影响、极端气候分析
当前的CMIP6计划相较于前代模型,在空间分辨率、物理过程表达和地球系统组件耦合等方面均有显著提升。 一:气候变化研究的AI新视角 1、气候模型基础与全球气候模型(GCM) 全球气候(环流)模型的基本原理、发…...
如何精准控制大模型的推理深度
论文标题 ThinkEdit: Interpretable Weight Editing to Mitigate Overly Short Thinking in Reasoning Models 论文地址 https://arxiv.org/pdf/2503.22048 代码地址 https://github.com/Trustworthy-ML-Lab/ThinkEdit 作者背景 加州大学圣迭戈分校 动机 链式推理能显…...
1. Git 下载和安装
文章目录 Git 下载Git 安装(以windows为例)Git 使用(以windows为例) Git 下载 1.进 Git 官网 https://git-scm.com/downloads 2.选择对应的操作系统 3.选择对应的操作系统位数 Git 安装(以windows为例)…...
git回滚指定版本并操作
你可以通过以下步骤切换到第三个版本。根据你的需求,有两种主要方法: 方法 1:临时查看第三个版本(不修改当前分支) 适用于仅查看或测试旧版本,不保留后续修改: 找到第三个版本的提交哈希&#…...
FastAdmin和thinkPHP学习文档
介绍 - FastAdmin框架文档 - FastAdmin开发文档https://doc.fastadmin.net/doc目录结构 ThinkPHP5.0完全开发手册 看云ThinkPHP V5.0是一个为API开发而设计的高性能框架——是一个颠覆和重构版本,采用全新的架构思想,引入了很多的PHP新特性,…...
通过HTTP协议实现Git免密操作的解决方案
工作中会遇到这样的问题的。 通过HTTP协议实现Git免密操作的解决方案 方法一:启用全局凭据存储(推荐) 配置凭证存储 执行以下命令,让Git永久保存账号密码(首次操作后生效): git config --g…...
git 查看某一文件夹下所有文件 修改记录
git: 如何查询某个文件或者某个目录的更新历史_git 查看指定文件夹的记录-CSDN博客 git log --follow path/to/your/file git log -p --follow path/to/your/file git log --stat --follow path/to/your/file这是最常用的方法,可以显示指定文件的所有提交历史…...
测试(一)
软件的生命周期: 需求分析——计划——设计——编码——测试——运行维护 常见的开发模型: 瀑布模型: 最基本的开发模型,绝大多数开发模型的基本框架。 特点:线性的开发流程 使用场景:需求固定ÿ…...
解决华硕主板Z890m下载ubuntu20.04后没有以太网问题
问题描述: 华硕主板Z890m下载双系统ubuntu20.04后,发现ubuntu不能打开以太网。 问题原因: 华硕主板的网卡驱动是r8125,而ubuntu20.04的驱动版本是r8169,所以是网卡驱动不匹配造成 解决方案 开机界面按下F2进入BOIS模式&#…...
从零推导飞机小扰动运动线性方程——0. 学习目录
第0期文章——学习目录 如图,本专栏将连载以下学习内容,带你从零开始学习飞机小扰动方程!...
Agentic AI 干货!DeepSeek + OpenAI SDK 构建 Agent 实战
引言: DeepSeek-R1、OpenAI-o1 等具备内化的假设、反思、验证等优秀推理能力的 LLM 大型推理模型将 AI 发展推进到智能体 AI 时代,将使 AI Agent 迸发出远超上一代由外化的手搓式简单推理 Agent 不可比拟的发展势能。 在 GTC2025 大会上,英伟…...
【语法】C++的list
目录 为什么会有list? 迭代器失效: list和vector的迭代器不同的地方: list的大部分用法和vector都很像,例如push_back,构造,析构,赋值重载这些就不再废话了,本篇主要讲的是和vecto…...
Java接口性能优化面试问题集锦:高频考点与深度解析
1. 如何定位接口性能瓶颈?常用哪些工具? 考察点:性能分析工具的使用与问题定位能力。 核心答案: 工具:Arthas(在线诊断)、JProfiler(内存与CPU分析)、VisualVM、Prometh…...
基于STM32与应变片的协作机械臂力反馈控制系统设计与实现---5.2 工业机械臂系统性能测试全方案(专业工程级)
5.2 工业机械臂系统性能测试全方案(专业工程级) 一、测试体系架构设计 1.1 三级测试体系 #mermaid-svg-A55VxjZ7ENKNWAli {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-A55VxjZ7ENKNWAli .error-icon{fill:#55…...
VM——相机拍照失败
1、问题:相机频闪触发,在MVS中正常出图,在VM中出现拍照失败 2、解决: 1、首先排查网络设置(巨帧是否设置) 2、电脑的所有防火墙是否关闭 3、在MVS中恢复相机的设置参数为默认参数,删除VM中的全…...
图解力扣回溯及剪枝问题的模板应用
文章目录 选哪个的问题17. 电话号码的字母组合题目描述解题代码图解复杂度 选不选的问题78. 子集题目描述解题代码图解复杂度 两相转化77. 组合题目描述解题代码法一:按选哪个的思路法二:按选不选的思路 图解选哪个:选不选 复杂度 选哪个的问…...
Trae + LangGPT 生成结构化 Prompt
Trae LangGPT 生成结构化 Prompt 0. 引言1. 安装 Trae2. 克隆 LangGPT3. Trae 和 LangGPT 联动4. 集成到 Dify 中 0. 引言 Github 上 LangGPT 这个项目,主要向我们介绍了写结构化Prompt的一些方法和示例,我们怎么直接使用这个项目,辅助我们…...
模糊测试究竟在干什么
目录 1.软件漏洞和缺陷 2.模糊测试与传统测试 3.汽车领域中的模糊测试 4.常见工具总结 1.软件漏洞和缺陷 提单、上票、拒收,这是开发和测试的日常博弈。大多数时候,我们是根据自己对需求的理解来进行开发和测试,这基本是属于功能层级。 …...
【RTD200P04 MCAL 篇3】 S32M244 PWM PDB ADC控制
【RTD200P04 MCAL 篇3】 S32M244 PWM PDB ADC控制 一,文档简介二,PWMTRGMUXPDBADC 2ch 软件配置与实现2.1 软硬件版本平台2.2 MCAL工程以及模块配置2.2.1 Dio 模块配置2.2.2 Adc模块配置2.2.3 Mcu模块配置2.2.4 Platform模块配置2.2.5 Port模块配置2.2.6…...
03--Deepseek服务器部署与cjson解析
一、ollama部署deepseek模型 1、Ollama 是一个开源的本地大语言模型运行框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。 Ollama 教程:从 0 到 1 全面指南 教程【全文两万字保姆级详细讲解】 -CSDN博客 1.下载o…...
实现抗隐私泄漏的AI人工智能推理
目录 什么是私人AI? 什么是可信执行环境? TEE 如何在 AI 推理期间保护数据? 使用 TEE 是否存在风险? 有哪些风险? Atoma 如何应对这些风险 为什么去中心化网络是解决方案 人工智能推理过程中还有其他保护隐私的方法吗? 私人人工智能可以实现什么? 隐私驱动的应…...
Kotlin 学习--数组
一、关于数组的基础知识和常用方式 /*** kotlin 数组* 使用arrayOf创建数组,必须指定数组的元素,可以是任意类型* */val arrayNumber arrayOf(1, 2, 3, 4)/*** 集合中的元素可以是任意类型* kotlin 中的Any 等价于 java 中的Object 对象的意思* */val a…...
Spring Boot 启动后自动执行 Service 方法终极指南
**导语:**在 Spring Boot 开发中,我们经常需要在应用启动后立即执行初始化任务(如加载配置、预热缓存、启动定时任务)。本文将深度解析 5 种主流实现方案,包含完整代码示例、执行顺序控制技巧和避坑指南&a…...
STM32 HAL库之GPIO示例代码
LED灯不断闪烁 GPIO初始化,main文件中的 MX_GPIO_Init(); 也就是在 gpio.c文件中 void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOE_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOA_C…...
中间件-消息队列
SpringAMQP 任何语言只要遵循AMAP协议,都可以与RabbitMQ交互 生产者、队列、交换机、消费者 生产者Publisher:生产消息,发给交换机 交换机Exchange:接收生产者发送的消息。知道如何处理消息,例如递交给某个特别队列、…...
go游戏后端开发32:自摸杠处理逻辑
当我们在自摸杠时,实际上在杠完之后,我们还需要进行一个删除操作。因此,我们需要在上面拷贝一个删除操作。由于这是自摸杠,所以这个地方需要删除四次。在这里,我们需要注意的是,自摸杠时,传过来…...
AI创业风向标:构建下一代「AI叙事创作平台」
随着技术的进步和市场需求的爆发,AI故事叙述平台正成为投资者和创业者关注的焦点。本文将探讨为何这一赛道值得关注,并提供一些关于如何构建成功的AI叙事创作平台的战略建议。 一、为什么这是2025年值得关注的赛道? 1. 底层需求的爆发 人类永恒的故事需求:全球每月有超过…...
拜特科技签约惠生工程,携手打造高效资金管理系统
近日,拜特科技成功签约惠生工程(中国)有限公司(以下简称“惠生工程”)资金管理系统项目。此次双方携手打造一套先进的资金管理系统,为惠生工程的战略发展注入强劲新动力,推动其资金管理迈向更高水平。 惠生工程作为行…...
快瞳宠物肢体关键点检测:让宠物设备更懂“猫言狗语”
在宠物经济高速发展的今天,智能设备已渗透到养宠生活的方方面面。然而,如何让设备真正理解宠物的行为意图?快瞳科技推出的宠物肢体关键点检测技术,通过精准捕捉宠物肢体动作,为智能喂食、健康监测、行为训练等场景提供…...
【安卓】APP生成器v1.0,生成属于你的专属应用
今天作者给大家分享一个超级好用的手机APP。还在为反复搜索常用网站抓狂?今天安利一款颠覆性神器——它能将你所有心头好的网页变成专属按钮,像搭乐高一样DIY你的「软件」,从此告别收藏夹混乱!小说党、资讯控、摸鱼达人集体狂喜&a…...
详细解读react框架中的hooks
React Hooks 是 React 16.8 引入的一项革命性特性,它允许你在函数组件中使用状态(state)和其他 React 特性,而无需编写 class 组件。下面将详细解读 React Hooks 的核心概念、常用 Hooks 及其工作原理。 一、Hooks 的核心概念 1. 什么是 Hooks Hooks …...
机器学习01-支持向量机(SVM)(未完)
参考浙大 胡浩基老师 的课以及以下链接: https://blog.csdn.net/m0_74100344/article/details/139560508 https://blog.csdn.net/2301_78630677/article/details/132657023 https://blog.csdn.net/lsb2002/article/details/131338700 一、一些定义 T是倒置&…...
Java进阶版线程池(超详细 )
线程池 线程池工具类 Executors Executors 是 Java 提供的一个工具类,它包含了多个静态方法,能够方便地创建不同类型的线程池。 newFixedThreadPool 创建一个固定大小的线程池,线程池中的线程数量固定,当有新任务提…...
场外期权只适合上涨行情吗?
场外期权与直接进行期货市场操作相比,场外期权让我们有了更多的选择空间。”目前期权市场有了更多合适的风险管理模式,场外期权衍生品工具与其需求不谋而合,适合做以小博大,做各种对冲大盘下跌风险等等策略,下文为大家…...
echarts图表相关
echarts图表相关 echarts官网折线图实际开发场景一: echarts官网 echarts官网 折线图 实际开发场景一: 只有一条折线,一半实线,一半虚线。 option {tooltip: {trigger: "axis",formatter: (params: any) > {const …...
【操作系统(Linux)】——多线程对共享变量访问的同步与互斥
一、多线程对共享变量的非互斥访问 我们将要做的:构造多线程共享变量竞争的案例,并分析现象发生的原因,进而思考解决方式。 案例源代码: #include <stdio.h> #include <stdlib.h> #include <pthread.h> #inc…...
deeplabv3+街景图片语义分割,无需训练模型,看不懂也没有影响,直接使用,cityscapes数据集_16
目录 1、下载链接1.1、CSDN链接,含权重文件直接使用,建议直接下这个,还不限速。1.2 Github链接: 2、下载代码,下载预训练好的权重3、预测代码4、像素提取,或者说类别提取5、文档部分内容截图6、其他数据处理…...
[前端]从人体结构看网页三要素:HTML、CSS 与 JavaScript
目录 一、HTML:网页的 “骨架” 二、CSS:网页的 “血肉” 三、JavaScript:网页的 “神经系统” 四、三者协同构建精彩网页 在互联网的浩瀚海洋中,网页是我们与世界交互的重要窗口。一个精彩的网页背后,离不开 HTML、CSS 和 JavaScript 这三位 “幕后英雄”。有趣的是,…...
【Leetcode】3375. 使数组的值全部为 K 的最少操作次数
文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接🔗 给你一个整数数组 nums 和一个整数 k 。 如果一个数组中所有 严格大于 h 的整数值都 相等 ,那么我们称整数 h 是 合法的 。 比方说,如果 nums [10, 8, 10…...
封装uniapp request promise化
uniapp request 封装 一、 封装方法1. 使用 promis 封装 request2. 封装 api 在 api.js3.在要请求的页面 调用 api 一、 封装方法 1. 使用 promis 封装 request const BASE_URL 你的url接口 //比如 http://198.12.3.3/pzexport function request(config {}){let {url,dat…...
架构演进成熟度校验体系构建
架构演进成熟度校验体系构建 ——基于电商价格服务Checklist的图形化实践指南 一、成熟度校验全景视图 #mermaid-svg-tXchQ6nY7QzNUrL1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-tXchQ6nY7QzNUrL1 .error-ico…...
Llama 4全面评测:官方数据亮眼,社区测试显不足之处
引言 2025年4月,Meta正式发布了全新的Llama 4系列模型,这标志着Llama生态系统进入了一个全新的时代。Llama 4不仅是Meta首个原生多模态模型,还采用了混合专家(MoE)架构,并提供了前所未有的上下文长度支持。本文将详细介绍Llama 4…...
kotlin 多个fragment beginTransaction容器添加使用
在Kotlin中如何使用Fragment的beginTransaction来添加多个Fragment到容器中。我需要先回顾一下Fragment的基本用法,然后考虑多个Fragment的情况。 FragmentTransaction的beginTransaction是用来开启一个事务,然后添加、替换或移除Fragment。通常&#x…...
(PTA) L2-011-L2-015
L2-012 关于堆的判断 由于没有得到AC代码(1,3测试点错误),这里先不做展示,等后续复盘的时候进行补充。 L2-011 玩转二叉树 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序…...
管理Linux服务器的用户和组
用户/组 命令符会展示当前用户名和主机名 创建用户,同时创建同名组 useradd 用户名 设置密码 passwd 用户名 切换用户登录 su 用户名 删除用户 userdel -r 用户名 记录用户信息的文件 /etc/passwd 记录密码(密文)信息的文件 /etc/sh…...