Kotlin 协程 (三)
协程通信是协程之间进行数据交换和同步的关键机制。Kotlin 协程提供了多种通信方式,使得协程能够高效、安全地进行交互。以下是对协程通信的详细讲解,包括常见的通信原语、使用场景和示例代码。
1.1 Channel
定义:Channel 是一个消息队列,用于协程之间的通信。它允许协程发送和接收数据,类似于 MPI(Message Passing Interface)中的消息传递机制。
特点:
- 线程安全。
- 支持多种通信模式,如无缓冲、有缓冲和无限缓冲。
- 提供挂起函数
send
和receive
,用于发送和接收数据。 - 可以关闭。
Channel 类型
类型 | 描述 | 创建方式 | 适用场景 |
---|---|---|---|
Rendezvous | 无缓冲(默认) | Channel<T>() | 严格的发送-接收同步 |
Buffered | 固定大小缓冲 | Channel<T>(capacity) | 控制内存使用 |
Conflated | 保留最新值 | Channel<T>(CONFLATED) | 只需要最新数据 |
Unlimited | 无限缓冲 | Channel<T>(UNLIMITED) | 生产者快于消费者 |
Broadcast | 广播给多个接收者 | BroadcastChannel<T>(capacity) | 一对多通信 |
使用场景:
1.生产者-消费者模式
- 场景描述:一个或多个生产者协程生成数据,一个或多个消费者协程处理数据。
- 适用性:当数据需要按顺序处理时,
Channel
提供了天然的 FIFO 队列。 - 示例:文件处理流水线,其中文件读取、处理和写入由不同的协程完成。
2 .协程间的事件总线
- 场景描述:一个协程发送事件,多个协程监听并响应这些事件。
- 适用性:当需要解耦协程之间的通信时,
Channel
可以作为事件传递的媒介。 - 示例:在 GUI 应用中,用户操作(如按钮点击)通过
Channel
发送事件,不同的协程根据事件执行相应的逻辑。
3. 资源池管理
- 场景描述:多个协程需要共享一组有限资源,如数据库连接或网络请求。
- 适用性:
Channel
可以控制对资源的并发访问,避免资源争用导致的冲突。 - 示例:使用
Channel
作为资源池,协程从池中请求资源,使用完毕后释放回池中
示例:
fun main() = runBlocking {val channel = Channel<Int>() // 创建无缓冲通道// 生产者协程launch {for (x in 1..5) {println("Sending $x")channel.send(x) // 挂起直到有接收者delay(100) // 模拟工作}channel.close() // 关闭通道}// 消费者协程launch {for (y in channel) { // 使用for循环接收println("Received $y")}println("Channel is closed")}delay(2000)
}
1.2 Flow
定义:Flow
是一种冷流(cold stream),意味着数据流只有在收到收集(collection)请求时才会开始发射数据。它支持挂起操作,可以与协程完美结合,实现异步计算和数据处理。
特点:
- 异步数据流:以异步方式处理连续数据流。
- 声明式编程:通过操作符链式调用处理数据流。
- 可组合性:支持 map、filter、flatMap、zip 等操作符。
- 取消支持:与协程一样支持取消操作。
基本使用:
//使用 flow 建造器创建一个 Flow 对象。
fun transformFlow() = flow {for (i in 1..5) {delay(100)emit(i)}
}.map { it * 2 } // 将每个值乘以 2.filter { it > 4 } // 过滤掉小于等于 4 的值fun main() = runBlocking {
//使用 collect 函数收集 Flow 发射的数据。transformFlow().collect { value -> println("Transformed value: $value")}
}
使用场景:
1 .异步数据流处理
- 场景描述:对异步数据流进行转换、合并、过滤等操作。
- 适用性:当需要对数据流进行复杂的操作时,
Flow
提供了丰富的操作符。 - 示例:在数据处理管道中,使用
Flow
对数据进行映射、过滤和归约。
2. 网络请求与数据解析
- 场景描述:从网络获取数据,并进行解析和转换。
- 适用性:
Flow
可以与网络库(如 Retrofit)结合,简化异步网络请求的处理。 - 示例:使用
Flow
处理分页网络请求,逐页获取数据并进行解析。
3. 数据库查询与观察
- 场景描述:从数据库查询数据,并对结果进行观察。
- 适用性:
Flow
可以与数据库库(如 Room)结合,实现数据的异步查询和实时更新。 - 示例:在 Android 应用中,使用
Flow
监听数据库表的变化,并更新 UI。
示例:
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET
import kotlinx.coroutines.*interface ApiService {@GET("data")fun fetchData(): Flow<String>
}val apiService = Retrofit.Builder().baseUrl("https://api.example.com").addConverterFactory(GsonConverterFactory.create()).build().create(ApiService::class.java)fun main() = runBlocking {apiService.fetchData().flowOn(Dispatchers.IO) // 在 IO 线程上执行网络请求.collect { data ->println("Received data: $data")}
}
1.3 SharedFlow 和 StateFlow
定义:SharedFlow 和 StateFlow 是 Kotlin Flow 库中的两种特殊 Flow,用于在多个收集器之间共享状态和数据流。
特点:
- SharedFlow:热流,允许多个收集器接收数据,可配置重放(replay)和缓冲,不保存状态。
- StateFlow:特殊的 SharedFlow,必须有初始值,只保留最新值,并在收集器加入时立即发出当前状态。
使用场景:
1. 事件流共享
- 场景描述:多个协程需要共享同一个事件流,并且每个协程都能接收到事件。
- 适用性:当事件需要被多个订阅者处理,且每个订阅者都能独立地接收事件时。
- 示例:在实时数据应用中,传感器数据通过
SharedFlow
分发给多个处理单元。
2 状态广播
- 场景描述:一个协程更新状态,多个协程监听状态变化。
- 适用性:当状态变化需要通知给多个观察者时,
SharedFlow
提供了广播机制。 - 示例:在游戏开发中,玩家状态(如生命值、分数)通过
SharedFlow
广播给 UI 和逻辑处理单元。
3. 背压管理
- 场景描述:生产者生成数据的速度可能快于消费者处理数据的速度。
- 适用性:
SharedFlow
支持背压策略,可以控制数据的发送速度,避免消费者过载。 - 示例:在数据流处理中,使用
SharedFlow
缓解高速数据源对处理单元的压力。
示例:
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*fun main() = runBlocking {val sharedFlow = MutableSharedFlow<String>()// 事件发送协程launch {sharedFlow.emit("Event 1")delay(1000)sharedFlow.emit("Event 2")}// 事件监听协程 1launch {sharedFlow.collect { event ->println("Listener 1 received: $event")}}// 事件监听协程 2launch {sharedFlow.collect { event ->println("Listener 2 received: $event")}}delay(2000) // 等待事件处理完成coroutineContext.cancelChildren() // 取消所有子协程
}
1.4 Await 和 Async
定义:async
是一种启动协程并获取其结果的方式。await
用于等待 async
协程的结果。
特点:
async
会立即返回一个Deferred
对象,可以在需要时通过await
获取结果。- 支持结构化并发,
await
会在需要时挂起协程,直到结果准备好。
使用场景:
- 当需要并行执行任务并聚合结果时。
- 当需要按需获取协程结果时。
示例:
import kotlinx.coroutines.*suspend fun main() {val deferred = async { expensiveComputation() }val result = deferred.await()println("Result: $result")}suspend fun expensiveComputation(): Int {delay(1000)return 42}
1.5 Actor
定义:Actor 是结合了协程和通道的实体,封装了状态和处理消息的能力。
特点:
- 消息传递:Actor 之间通过发送和接收消息进行通信。
- 封装状态:每个 Actor 封装了自己的状态和行为,其他 Actor 无法直接访问其内部状态。
- 异步通信:通过消息传递实现异步交互,避免传统并发模型中的死锁和竞争问题。
使用场景:
- 分布式系统:在分布式环境中,Actor 可以作为独立的计算单元,通过消息传递完成协同任务。
- 实时通信:适用于需要实时处理消息的场景,如聊天应用、游戏服务器等。
- 高并发任务处理:处理需要同时执行多个任务的应用,例如订单处理、数据分析等。
示例:
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*fun main() = runBlocking {val actor = actor<String> {//Actor 内部通过 for 循环接收来自 channel 的消息,并执行相应的处理逻辑。for (msg in channel) {println("Received: $msg")// 处理消息}}// 向 Actor 发送消息actor.send("Hello")actor.send("World")actor.close() // 关闭 Actor
}
2. 示例:实时搜索场景
class SearchViewModel : ViewModel() {// 使用 MutableStateFlow 存储可变的搜索查询字符串// StateFlow 是热流,会自动收集数据,适合 UI 状态管理private val searchQuery = MutableStateFlow("")// 使用 MutableStateFlow 存储可变的搜索结果列表// 注意:这里返回的 searchResults 是不可变的 StateFlow,避免外部直接修改private val _searchResults = MutableStateFlow<List<String>>(emptyList())val searchResults: StateFlow<List<String>> = _searchResultsinit {// 在 viewModelScope 中启动协程// viewModelScope 是 ViewModel 提供的协程作用域,基于 Dispatchers.Main 运行// 当 ViewModel 销毁时,viewModelScope 会自动取消所有协程,避免内存泄漏viewModelScope.launch {// 构建 Flow 管道,处理搜索查询到结果的转换searchQuery// debounce(300):防抖处理,300ms 内多次输入只触发最后一次// 避免用户快速输入时触发过多搜索请求.debounce(300)// filter it.length > 2:过滤短查询,避免无效请求// 只有查询长度大于 2 时才继续处理.filter { it.length > 2 }// distinctUntilChanged():忽略重复的查询,避免重复请求// 只有查询内容变化时才继续处理.distinctUntilChanged()// flatMapLatest:取消前一个未完成的搜索,只保留最新的查询结果// 当新的查询到来时,会取消前一个协程任务.flatMapLatest { query ->// 调用 performSearch 发起搜索,返回 Flow<List<String>>performSearch(query)}// catch emit(emptyList()):捕获异常并返回空列表,避免 UI 出错// 如果搜索过程中发生异常,会发射空列表作为默认结果.catch { emit(emptyList()) }// collect:收集 Flow 发射的数据,更新搜索结果.collect { results ->// 更新 _searchResults 的值,UI 会自动响应变化_searchResults.value = results}}}// 处理用户输入变化,更新搜索查询fun onSearchQueryChanged(query: String) {// 直接设置 MutableStateFlow 的值,会触发 Flow 管道重新计算searchQuery.value = query}// 模拟网络搜索请求,返回 Flow<List<String>>private fun performSearch(query: String): Flow<List<String>> = flow {// delay(1000):模拟耗时操作(如网络请求),可被协程取消// 如果协程被取消,delay 会立即抛出 CancellationExceptiondelay(1000)// emit:发射搜索结果// 这里模拟返回两个结果项emit(listOf("query result 1", "query result 2"))}
}
相关文章:
Kotlin 协程 (三)
协程通信是协程之间进行数据交换和同步的关键机制。Kotlin 协程提供了多种通信方式,使得协程能够高效、安全地进行交互。以下是对协程通信的详细讲解,包括常见的通信原语、使用场景和示例代码。 1.1 Channel 定义:Channel 是一个消息队列&a…...
AI 商业化部署中,ollama 和 vllm 的选型对比
介绍 ollama Ollama是指一个开源的大模型服务工具,旨在简化大型语言模型(LLM)的本地部署、运行和管理。它让用户能够在本地设备上轻松运行和管理各种大语言模型,无需依赖云端服务。 vllm 在深度学习推理领域,vLLM框…...
mysql的乐观锁与悲观锁
1.悲观锁 含义:假设会发生冲突,因此在操作数据之前对数据加锁,确保其他事务无法访问该数据。 应用场景:适用于并发冲突多,写多读少的场景,通过加锁的方式确保数据的安全性。 实现方式:使用行…...
进程——概念及状态
目录 概念 介绍 举例 进程状态 概念 解释 实例 R S T t Z 孤儿进程 概念 介绍 大多数初学者会认为进程就是从硬盘加载到内存的可执行文件(当可执行文件被加载到内存里称为程序),实际上并不是这样的,进程其实是操作系…...
服务器数据恢复—Linux系统服务器崩溃且重装系统的数据恢复案例
服务器数据恢复环境: linux操作系统服务器中有一组由4块SAS接口硬盘组建的raid5阵列。 服务器故障: 服务器工作过程中突然崩溃。管理员将服务器操作系统进行了重装。 用户方需要恢复服务器中的数据库、办公文档、代码文件等。 服务器数据恢复过程&#…...
【git】git commit模板
【git】git commit模板 目录 【git】git commit模板1.使用git commit 模板操作步骤:使用示例: 2. gitlab merge 模板 1.使用git commit 模板 操作步骤: 设置模板路径,其中path就是commit模板路径 git config --global commit.template path设…...
IGBT选型时需关注的参数,适用场景(高压大电流低频)以及驱动电路设计注意事项
概述 IGBT(绝缘栅双极型晶体管)是电力控制和电力转换的核心器件,是由BJT(双极型晶体管)和MOS(绝缘栅型场效应管)组成的复合全控型电压驱动式功率半导体器件。有高输入阻抗(MOSFET优点…...
hghac集群服务器时间同步(chrony同步)
文章目录 环境文档用途详细信息 环境 系统平台:银河麒麟(龙芯)svs,银河麒麟 (X86_64),银河麒麟 (飞腾),银河麒麟 (鲲鹏),银河麒麟 (海光),银河麒…...
Linux 特权管理与安全——从启用 Root、Sudo 提权到禁用与防护的全景解析
一、前言 为什么关注特权? Root(超级用户)拥有系统所有权限,一旦被滥用或入侵,后果不堪设想。运维与安全的平衡 既需要日常运维中快速提权执行管理任务,又要避免过度开放特权带来的风险。攻防同源理念 了解…...
初识Linux · 数据链路层
目录 前言: 以太网帧协议 ARP协议 ARP协议理解 ARP协议字段 交换机 前言: 前文我们通过OSI模型,一直到TCP/IP四层模型,经过了三篇文章左右的功夫,我们把网络层介绍完毕,主要还是介绍的IP协议的iphdr…...
Linux探秘:驾驭开源,解锁高效能——基础指令
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...
【Linux】第二十二章 访问网络附加内存
1. NFS的主要功能是什么? NFS是由Linux、UNIX及类似操作系统使用的互联网标准协议,主要功能就是提供网络文件共享,允许不同的计算机系统之间通过网络共享文件,它使得网络上的计算机能够像访问本地文件系统一样访问远程计算机上的…...
Revit BIM 模型批量转换为 Datasmith 格式教程
Revit BIM 模型批量转换为 Datasmith 格式教程 一、背景与痛点 在建筑信息模型(BIM)与游戏开发的协同工作中,常需将 Revit 模型导入虚幻引擎(UE)。虽然 Revit 的 Datasmith 插件可实现单文件转换,但面对成百上千个模型时,手动操作效率极低。本文将分享如何开发一个自动…...
Linux 磁盘扩容实战案例:从问题发现到完美解决
Linux 磁盘扩容实战案例:从问题发现到完美解决 案例背景 某企业服务器根目录 (/) 空间不足,运维人员通过 df -h 发现 /dev/vda1 分区已 100% 占满(99G 已用)。检查发现物理磁盘 /dev/vda 已扩展至 200G,但分区和文件…...
Linux 系统不终止进程的情况下关闭长连接
使用 tcpkill 中断指定 TCP 连接 适用场景:需主动中断已知源IP或目标端口的连接,无需进程重启。 安装 dsniff 工具(包含 tcpkill): yum -y install dsniff 捕获并杀死特定连接(例如目标IP 192.168.1.10…...
从零开始创建React项目及制作页面
一、React 介绍 React 是一个由 Meta(原Facebook) 开发和维护的 开源JavaScript库,主要用于构建用户界面(User Interface, UI)。它是前端开发中最流行的工具之一,广泛应用于单页应用程序(SPA&a…...
Unity-编辑器扩展
之前我们关于Unity的讨论都是针对于Unity底层的内容或者是代码层面的东西,这一次我们来专门研究Unity可视化的编辑器,在已有的基础上做一些扩展。 基本功能 首先我们来认识三个文件夹: Editor,Gizmos,Editor Defaul…...
系分论文《论遗产系统演化》
系统分析师论文范文系列 摘要 2022年6月,某金融机构启动核心业务系统的技术升级项目,旨在对其运行超过十年的遗留系统进行演化改造。该系统承担着账户管理、支付结算等关键业务功能,但其技术架构陈旧、扩展性不足,难以适应数字化转型与业务快速增长的需求。作为系统分析师,…...
Django基础(二)Django 项目基础操作
一、实验目标 熟悉 Django 基本命令 理解 Django 项目和应用的目录结构 掌握项目初始化、应用创建与注册、项目启动、视图函数编写、路由配置、数据库配置等基础操作 二、Django 项目初始化 进入虚拟环境 source venv/bin/activate创建 Django 项目 django-admin startproje…...
【图像大模型】Stable Video Diffusion:基于时空扩散模型的视频生成技术深度解析
Stable Video Diffusion:基于时空扩散模型的视频生成技术深度解析 一、架构设计与技术演进1.1 核心模型架构1.2 技术创新点1.2.1 运动预测网络1.2.2 层级式训练策略 二、系统架构解析2.1 完整生成流程2.2 性能指标对比 三、实战部署指南3.1 环境配置3.2 基础推理代码…...
【免杀】C2免杀技术(七)远程线程注入
远程线程注入(Remote Thread Injection)是一种常见的进程注入技术,经常用于红队渗透、恶意软件加载、持久化控制等场景中,尤其在免杀(AV/EDR bypass)应用领域中,是一种历史悠久但依然有效的手段…...
二、【环境搭建篇】:Django 和 Vue3 开发环境准备
【环境搭建篇】:Django 和 Vue3 开发环境准备 前言为什么我们需要特定的开发环境?准备工作第一步:搭建后端开发环境 (Python, Django, DRF)1. 安装 Python2. 创建和激活 Python 虚拟环境3. 在虚拟环境中安装 Django 和 DRF 第二步:…...
【神经网络与深度学习】激活函数的可微可导
引言: 在深度学习领域,激活函数扮演着至关重要的角色。它不仅影响神经网络的非线性建模能力,还直接关系到梯度计算的稳定性。在优化过程中,我们通常要求激活函数具有良好的数学性质,其中可微性是一个关键条件。相比简单…...
【Tauri2】046—— tauri_plugin_clipboard_manager(一)
目录 前言 正文 安装 Rust中的使用 对文字的操作 看看write_text的函数签名 看看read_text的函数签名 对图像的操作 对html的操作 总结 前言 这篇就来看看clipboard这个插件。 参考如下 Clipboard | Taurihttps://tauri.app/plugin/clipboard/ 正文 安装 执行下…...
高效选课系统:一键管理你的课程表
选课流程 数据模型 我的课程表Controller Api(value "我的课程表接口", tags "我的课程表接口") Slf4j RestController public class MyCourseTablesController {Autowiredprivate MyCourseTablesService myCourseTablesService;ApiOperation("添加…...
Pytorch分布式训练,数据并行,单机多卡,多机多卡
分布式训练 所有代码可以见我github 仓库:https://github.com/xiejialong/ddp_learning.git 数据并行(Data Parallelism,DP) 跨多个gpu训练模型的最简单方法是使用 torch.nn.DataParallel. 在这种方法中,模型被复制…...
Secarmy Village: Grayhat Conference靶场
Secarmy Village: Grayhat Conference 来自 <Secarmy Village: Grayhat Conference ~ VulnHub> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶…...
centos 9 Kickstart + Ansible自动化部署 —— 筑梦之路
目标 利用 Kickstart 完成 centos 9 系统的全自动安装(裸金属/虚拟机)。 安装完成后自动接入 Ansible 进行软件包、服务、用户、配置等系统初始化操作。 实现一套通用、可重复、可维护的自动化交付流程。 KS文件 # ks.cfg 示例 install lang zh_CN.…...
HarmonyOS应用开发入门宝典——项目驱动学习法实践
学习一项新技能,最好也是最快的方法就是动手实战。学习鸿蒙也一样,给自己定一个小目标,直接找项目练,这样进步是最快的。记住,最好的学习时机永远是现在,最好的老师永远是你正在开发的项目。 一、为什么选择…...
Python类的力量:第六篇:设计模式——Python面向对象编程的“架构蓝图”
文章目录 前言:从“代码堆砌”到“模式复用”的思维跃迁 一、创建型模式:对象创建的“智能工厂”1. 单例模式(Singleton):全局唯一的“资源管家”2. 工厂模式(Factory):对象创建的“…...
第50天-使用Python+Qt+DeepSeek开发AI运势测算
1. 环境准备 bash 复制 下载 pip install pyside6 requests python-dotenv 2. 获取DeepSeek API密钥 访问DeepSeek官网注册账号 进入控制台创建API密钥 在项目根目录创建.env文件: env 复制 下载 DEEPSEEK_API_KEY=your_api_key_here 3. 创建主应用框架 python 复制…...
CentOS系统上挂载磁盘
在CentOS系统上挂载磁盘,主要包括查看磁盘设备、分区(若需要)、格式化、创建挂载点和挂载等步骤,以下是详细操作: 1. 查看磁盘设备 使用fdisk -l或lsblk命令查看系统识别到的磁盘设备。 fdisk -l:列出所…...
(一) 本地hadoop虚拟机系统设置
1.配置固定IP地址(每一台都配置) 开启node1,修改主机名为node1,并修改固定IP为:192.168.88.131 # 修改主机名 hostnamectl set-hostname node1# 修改IP vim /etc/sysconfig/network-scripts/ifcfg-ens33 IPADDR"…...
亿级核心表如何优雅扩展字段
1 导语 亿级数据的核心表新增一个字段,远不止一句简单的“ALTER TABLE”,锁表风险、页分裂、索引性能衰减……每一个问题都可能引发线上事故。如何在不影响业务的前提下,只需简单的配置,即可实现字段的动态扩展?本文将…...
单端传输通道也会有奇偶模现象喔
奇模(Odd mode)与偶模(Even mode)对差动对是很关键的要素,其会影响奇/偶模阻抗与相位速度,设计不良甚会让共模噪声引入整个差动对使讯号质量下降。 然而对单端信号系统而言呢? 如果说一对side b…...
VUE3 中的 ResizeObserver 警告彻底解决方案
问题背景 今天在使用 Vue 3 Ant Design Vue 开发后台管理系统时,在页面频繁触发 元素尺寸变化(如表格滚动、窗口缩放) 的时候,控制台频繁出现如下警告: ResizeObserver loop completed with undelivered notificati…...
IDEA2025版本使用Big Data Tools连接Linux上Hadoop的HDFS
目录 Windows的准备 1. 将与Linux上版本相同的hadoop压缩包解压到本地 编辑2.设置$HADOOP HOME环境变量指向:E:\hadoop-3.3.4 3.下载hadoop.dll和winutils.exe文件 4.将hadoop.dll和winutils.exe放入$HADOOP HOME/bin中 IDEA中操作 1.下载Big Data Tools插件 2.添加并连…...
Gas优化利器:Merkle 树如何助力链上数据效率革命
目录 前言原理Merkle树示意图实战演示:构建 Merkle 树并在合约中验证离线构建 Merkle 树(手动计算Merkle树、生成mermaid示意图)编写Merkle.js脚本执行Merkle.js脚本执行结果展示mermaid流程图展示离线构建 Merkle 树(merkletreejs计算Merkle树、验证哈希路径)编写Merkle.…...
R语言空间分析实战:地理加权回归联合主成份与判别分析破解空间异质性难题
在自然和社会科学领域有大量与地理或空间有关的数据,这一类数据一般具有严重的空间异质性,而通常的统计学方法并不能处理空间异质性,因而对此类型的数据无能为力。以地理加权回归为基础的一系列方法:经典地理加权回归,…...
kafka入门(二)
Java客户端访问Kafka 引入maven依赖 <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka‐clients</artifactId> <version>2.4.1</version> </dependency> 消息发送端代码 package com.tuling.kafka.ka…...
学习日记-day11-5.20
完成目标: comment.java package com.zcr.pojo; import org.hibernate.annotations.GenericGenerator;import javax.persistence.*; //JPA操作表中数据,可以将对应的实体类映射到一张表上Entity(name "t_comment")//表示当前的实体类与哪张表…...
手淘不易被清洗销量的4个成交入口
在淘宝运营中,销量是店铺权重的重要指标之一,但平台对虚假交易的打击力度越来越大,许多商家因销量被清洗而损失惨重。那么,通过什么样的手淘成交入口稳定不易清洗呢?经过实测,我们总结了以下手淘4个不易被清…...
【Linux】Linux 多线程
目录 1. Linux线程概念2. 重谈进程地址空间---页表2.1 如何由虚拟地址转化为物理地址的 3. pthread库调用接口3.1 线程的创建---pthread_create3.2 线程等待---pthread_join3.3 线程的退出3.4 分离线程 4. 线程库5. 线程ID6. Linux线程互斥6.1 锁6.2 锁的接口6.2.1 互斥量的初始…...
DAY31
知识点回顾 规范的文件命名规范的文件夹管理机器学习项目的拆分编码格式和类型注解 作业:尝试针对之前的心脏病项目,准备拆分的项目文件,思考下哪些部分可以未来复用。 浙大疏锦行...
大模型应用开发“扫盲”——基于市场某款智能问数产品的技术架构进行解析与学习
本文将从一款问数产品相关技术架构,针对大模型应用开发中的基础知识进行“扫盲”式科普,文章比较适合新手小白,属于是我的学习笔记整理,大佬可以划走啦~产品关键信息已经进行模糊处理,如有侵权请联系删除。 文章目录 前…...
List优雅分组
一、前言 最近小永哥发现,在开发过程中,经常会遇到需要对list进行分组,就是假如有一个RecordTest对象集合,RecordTest对象都有一个type的属性,需要将这个集合按type属性进行分组,转换为一个以type为key&…...
打破建筑与制造数据壁垒:Revit 到 STP 格式转换全攻略(含插件应用 + 迪威模型实战)
引言 在建筑信息模型(BIM)与计算机辅助设计(CAD)领域,数据在不同软件和系统间的高效流转至关重要。Revit 作为 BIM 技术应用的主流软件,常用于建筑设计、施工和运维管理;而 STP(STE…...
RISC-V 开发板 MUSE Pi Pro USB 测试(3.0 U盘,2.0 UVC摄像头)
视频讲解: RISC-V 开发板 MUSE Pi Pro USB 测试(3.0 U盘,2.0 UVC摄像头) 总共开发板有4个USB的A口,1个USB的TypeC口,我们插上两个USB3.0的U盘和一个USB2.0的UVC摄像头来进行测试 lsusb -tv 可以看到有3个US…...
驱动相关基础
一、驱动分类与区别 字符设备驱动 一个字节一个字节进行读写操作的设备,以字符流的形式进行数据传输(如鼠标、键盘、串口)。 块设备驱动 以块为单位进行读写操作的设备,块的大小通常为 512 字节、1024 字节。 块设备驱动主…...
【node.js】核心进阶
个人主页:Guiat 归属专栏:node.js 文章目录 1. Node.js高级异步编程1.1 Promise深入理解1.1.1 创建和使用Promise1.1.2 Promise组合模式 1.2 Async/Await高级模式1.2.1 基本使用1.2.2 并行执行1.2.3 顺序执行与错误处理 1.3 事件循环高级概念1.3.1 事件循…...