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

Kotlin协程flow缓冲buffer

Kotlin协程flow缓冲buffer

先看一个普通的flow:

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking
import kotlin.system.measureTimeMillisfun main(args: Array<String>) {val delayTime = 100LrunBlocking {val time = measureTimeMillis {flowOf("A", "B", "C").onEach {//生产数据,假设产生了耗时操作。delay(delayTime)println("$it onEach")}.collect {//消费数据,假设产生了耗时操作。delay(delayTime)println("$it collect")}}println("cost= $time ms")}
}

A onEach
A collect
B onEach
B collect
C onEach
C collect
cost= 673 ms


再看加入buffer后:

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking
import kotlin.system.measureTimeMillisfun main(args: Array<String>) {val delayTime = 100LrunBlocking {val time = measureTimeMillis {flowOf("A", "B", "C").onEach {//生产数据,假设产生了耗时操作。delay(delayTime)println("$it onEach")}.buffer(32) //缓冲区保存的数据最大条数。.collect {//消费数据,假设产生了耗时操作。delay(delayTime)println("$it collect")}}println("cost= $time ms")}
}

A onEach
B onEach
A collect
C onEach
B collect
C collect
cost= 465 ms

运行时间缩短。

buffer的意义在onEach和collect之间缓冲,让每一条的数据,不在生产者-消费者之间阻塞。可以看到当A进入collect后,由于要delay(100),所以此时Kotlin直接返回onEach,进行下一条数据的处理,如果没有buffer,则需要等待collect里面的这条数据处理完,才调度回到onEach里面处理下一条。

kotlin协程flow filter map flowOn zip combine(1)_zhangphil的博客-CSDN博客一、flow ,emit,onCompletion,collect。四、map,重组改写数据。八、conflate 合并。九、debounce去重。二、函数作为flow。https://blog.csdn.net/zhangphil/article/details/130084723Kotlin协程flow发送时间间隔debounce_zhangphil的博客-CSDN博客debounce蕴含了一定的缓冲思想,即,不立刻触发事件,而是先把要发射的数据进入队列,稍等一定时间(时间)延迟触发,而触发的重要条件取决于前一条数据和后一条数据的时间间隔,注意,前一条和后一条尚未被发射出去,只是待命中。发射完ABC,Kotlin审视待发射的ABCD,按理说ABCD与ABC间隔200,满足发射timeOut值,但是ABCD与ABCDE间隔100,所以跳过ABCD,直接发射ABCDE。四、map,重组改写数据。A和AB都待发射,A和AB间隔100,所以跳过A,直接发射AB。https://blog.csdn.net/zhangphil/article/details/132515686

http://www.lryc.cn/news/143998.html

相关文章:

  • 完全免费的GPT,最新整理,2023年8月24日,已人工验证,不用注册,不用登录,更不用魔法,点开就能用
  • LeetCode538. 把二叉搜索树转换为累加树
  • TP6 使用闭合语句查询多个or的模型语句
  • 浅析Linux SCSI子系统:设备管理
  • 爬虫逆向实战(二十五)--某矿采购公告
  • DPLL 算法之分裂策略
  • Jmeter+ServerAgent
  • 打破数据孤岛!时序数据库 TDengine 与创意物联感知平台完成兼容性互认
  • ubuntu22安装和部署Kettle8.2
  • 修复 Ubuntu Linux 中的“找不到命令‘python’”错误
  • 【业务功能篇86】微服务-springcloud-系统性能压力测试-jmeter-性能优化-JVM参数调优
  • mysql的登录与退出
  • SOLIDWORKS工程图转DWG图层映射技巧
  • PMAC与Modbus主站进行Modbus Tcp通讯
  • MyBatis分页插件PageHelper的使用及MyBatis的特殊符号---详细介绍
  • Qt(C++)计算一段程序执行经过的时间
  • UnionTech OS(统信桌面操作系统)安装 g++ 和 cmake
  • php_webshell免杀--从0改造你的AntSword
  • RocketMQ mqadmin java springboot python 调用笔记
  • Java aspose 将HTML导出成Excel文件
  • 原生微信小程序 动态(横向,纵向)公告(广告)栏
  • pandas和polars简单的对比分析
  • Feign远程调用的使用
  • Postman API测试之道:不止于点击,更在于策略
  • 5G 数字乡村数字农业农村大数据中心项目农业大数据建设方案PPT
  • Golang Gorm 一对多的添加
  • 图像扭曲之锯齿
  • 【分布式技术专题】「OSS中间件系列」Minio的文件服务的存储模型及整合Java客户端访问的实战指南
  • 构建个人博客_Obsidian_github.io_hexo
  • 烟花厂人员作业释放静电行为检测算法