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
相关文章:
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 100Lru…...
完全免费的GPT,最新整理,2023年8月24日,已人工验证,不用注册,不用登录,更不用魔法,点开就能用
完全免费的ChatGPT,最新整理,2023年8月24日,已人工验证, 不用注册,不用登录,更不用魔法,点开就能用! 第一个:网址地址统一放在文末啦!文末直达 看上图你就能…...
LeetCode538. 把二叉搜索树转换为累加树
538. 把二叉搜索树转换为累加树 文章目录 [538. 把二叉搜索树转换为累加树](https://leetcode.cn/problems/convert-bst-to-greater-tree/)一、题目二、题解方法一:递归(中序遍历与节点更新)方法二:反向中序遍历与累加更新&#x…...
TP6 使用闭合语句查询多个or的模型语句
例子:查询出在单位表中所有的小学,初中和高中;其中school_period保存的就是学段数据$where []; $where[] function ($query) {$query->where(school_period, like, %小学%)->whereOr(school_period, like, %初中%)->whereOr(schoo…...
浅析Linux SCSI子系统:设备管理
文章目录 概述设备管理数据结构scsi_host_template:SCSI主机适配器模板scsi_host:SCSI主机适配器主机适配器支持DIF scsi_target:SCSI目标节点scsi_device:SCSI设备 添加主机适配器构建sysfs目录 添加SCSI设备挂载LunIO请求队列初…...
爬虫逆向实战(二十五)--某矿采购公告
一、数据接口分析 主页地址:某矿 1、抓包 通过抓包可以发现数据接口是cgxj/by-lx-page 2、判断是否有加密参数 请求参数是否加密? 通过查看“载荷”模块可以发现有一个param的加密参数 请求头是否加密? 无响应是否加密? 无c…...
DPLL 算法之分裂策略
前言 DPLL算法确实是基于树(或二叉树)的回溯搜索算法,它用于解决布尔可满足性问题(SAT问题)。下面我会分析您提到的DPLL算法中的分裂策略,以及它是如何在搜索过程中起作用的。 DPLL算法中的分裂策略是用于在…...
Jmeter+ServerAgent
一、Jmeter 下载 https://jmeter.apache.org/download_jmeter.cgi选择Binaries二进制下载 apache-jmeter-5.6.2.tgz 修改配置文件 jmeter下的bin目录,打开jmeter.properties 文件 languagezh_CN启动命令 cd apache-jmeter-5.6/bin sh jmeter二、ServerAgent 监…...
打破数据孤岛!时序数据库 TDengine 与创意物联感知平台完成兼容性互认
新型物联网实现良好建设的第一要务就是打破信息孤岛,将数据汇聚在平台统一处理,实现数据共享,放大物联终端的行业价值,实现系统开放性,以此营造丰富的行业应用环境。在此背景下,物联感知平台应运而生&#…...
ubuntu22安装和部署Kettle8.2
前提 kettle是纯java编写的etl开源工具,目前kettle7和kettle8都需要java8或者以上才能正常运行。所以运行kettle前先检查java环境是否正确配置,java版本是否是8或者以上。 kettle安装 1、创建kettle目录,并将kettle的zip包解压到kettle目…...
修复 Ubuntu Linux 中的“找不到命令‘python’”错误
在ubuntu 22.04版本中使用 callstack backtrace.txt 回溯错误点是碰到了该问题。 参考文章:链接 ubuntu22.04版本中默认只安装了python3版本 查看python各个版本安装情况,在终端输入命令: type python python2 python3如果安装了对应的版本…...
【业务功能篇86】微服务-springcloud-系统性能压力测试-jmeter-性能优化-JVM参数调优
系统性能压力测试 一、压力测试 压力测试是给软件不断加压,强制其在极限的情况下运行,观察它可以运行到何种程度,从而发现性能缺陷,是通过搭建与实际环境相似的测试环境,通过测试程序在同一时间内或某一段时间内&…...
mysql的登录与退出
mysql是c/s架构,意味着同时要有客户端和服务端 1 找到客户端。mysql.exe的安装目录 打开命令行 2 输入对应的服务器的ip,如果是本地,就是Localhost,如果是远程服务器,那就输入对应ip/域名。并且指定mysql监听的端口 …...
SOLIDWORKS工程图转DWG图层映射技巧
DWG格式的图纸在工程制图中有着非常重要的地位,工程实践中常常就需要将SOLIDWORKS工程图进行转换。对于两者之间数据衔接的妥善处理,是提升工作效率的有效手段。基于此目的,本次我们将介绍数据衔接的一个有效解决方案:图层数据的映…...
PMAC与Modbus主站进行Modbus Tcp通讯
PMAC与Modbus主站进行Modbus Tcp通讯 创建modbus通讯参数 在项目的PMAC Script Language\Global Includes下创建一个名为00_Modbus_Para.pmh的pmh文件。 Modbus[0].Config.ServerPort 0 Modbus[0].Config.ConnectTimeOut 6000 Modbus[0].Config.SendRecvTimeOut 0 Modbu…...
MyBatis分页插件PageHelper的使用及MyBatis的特殊符号---详细介绍
一,分页的概念 分页是一种将大量数据或内容分割成多个页面以便逐页显示的方式。在分页中,数据被分割成一定数量的页,每页显示一部分数据或内容,用户可以通过翻页或跳分页是一种将大量数据或内容分割成多个页面以便逐页显示的方式。…...
Qt(C++)计算一段程序执行经过的时间
一、前言 在许多应用程序和系统中,需要对经过的时间进行计算和记录。例如 可能想要测量某个操作的执行时间,或者记录一个过程中经过的时间以进行性能分析。在这些场景下,准确地计时是非常重要的。 Qt提供了一个功能强大的计时器类QElapsedTimer,可以方便地记录经过的时间…...
UnionTech OS(统信桌面操作系统)安装 g++ 和 cmake
文章目录 前言一、debian 10简介二、安装 g三、安装cmake参考资料 前言 统信桌面操作系统支持x86、龙芯、申威、鲲鹏、飞腾、兆芯等国产CPU平台,基于debian 10.x 的稳定版本,长期维护的统一内核版本(4.19)。 一、debian 10简介 Debian 10 是一款广泛使…...
php_webshell免杀--从0改造你的AntSword
0x00 前言: 为什么会有改造蚁剑的想法,之前看到有做冰蝎的流量加密,来看到绕过waf,改造一些弱特征,通过流量转换,跳过密钥交互。 但是,冰蝎需要反编译去改造源码,再进行修复bug&am…...
RocketMQ mqadmin java springboot python 调用笔记
命令 mqadmin命令列表 yeqiangyeqiang-MS-7B23:/opt/rocketmq-all-5.1.3-bin-release$ sh bin/mqadmin The most commonly used mqadmin commands are:updateTopic Update or create topicdeleteTopic Delete topic from broker and NameServer.…...
.NET校招真实面经:手写代码、项目深挖、算法到底考什么
文章目录写在前面:校招面试就像相亲,你得先过了"眼缘"这一关第一部分:手写代码——别做"嘴强王者",要做"手速达人"1.1 面试官为啥非要你手写代码?1.2 .NET校招手写代码到底考啥…...
领域驱动设计实践:event-sourcing-examples中的DDD聚合模式
领域驱动设计实践:event-sourcing-examples中的DDD聚合模式 【免费下载链接】event-sourcing-examples Example code for my building and deploying microservices with event sourcing, CQRS and Docker presentation 项目地址: https://gitcode.com/gh_mirrors…...
【Cadence Virtuoso】进阶:利用仿真数据反推工艺库MOSFET的λ与Vth实战
1. 为什么需要反推MOSFET参数? 刚接触TSMC 65nm工艺时,我发现PDK提供的参数表里λ和Vth都是固定值。但在实际设计电流镜和差分对时,这些"标准参数"总让我觉得哪里不对劲。后来在调试一个基准电流源时终于发现问题:PDK给…...
GUI智能体MAI-UI-8B API调用全攻略:从基础到进阶实战
GUI智能体MAI-UI-8B API调用全攻略:从基础到进阶实战 1. 认识MAI-UI-8B:你的GUI自动化助手 MAI-UI-8B是一款专为图形用户界面(GUI)操作设计的智能体,它能像人类一样"看"屏幕、"理解"界面元素并执行操作。想象一下&…...
深入XFS文件系统:从一次CentOS 7的Internal error报错,聊聊xfs_repair背后的原理与避坑指南
深入XFS文件系统:从Internal error报错到修复原理与实战指南 当你在一台运行CentOS 7的生产服务器上看到"XFS_WANT_CORRUPTED_GOTO"这个鲜红的报错信息时,作为运维工程师的肾上腺素会立刻飙升。这不是一个普通的I/O错误,而是XFS文件…...
重构窗口管理逻辑的效率革命:Loop重新定义macOS多任务体验
重构窗口管理逻辑的效率革命:Loop重新定义macOS多任务体验 【免费下载链接】Loop MacOS窗口管理 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 当你在三个浏览器窗口、两个文档和一个设计工具间频繁切换时,当你花费十分钟拖拽调整窗口…...
深度解析PAC文件解析器:构建智能代理路由系统的终极方案
深度解析PAC文件解析器:构建智能代理路由系统的终极方案 【免费下载链接】pacparser A library to parse proxy auto-config (PAC) files 项目地址: https://gitcode.com/gh_mirrors/pa/pacparser 在现代企业网络架构中,代理自动配置(…...
GitLab实战:如何用rebase -i优雅合并多个commit(附常见错误排查)
Git提交历史优化:交互式rebase高阶操作指南 1. 为什么需要整理Git提交历史 在团队协作开发中,我们经常会遇到提交历史杂乱无章的情况。想象一下这样的场景:你完成了一个新功能的开发,但在这个过程中产生了十几个零散的提交记录&am…...
效率飙升秘籍:用快马生成全自动opencode安装与配置工具
最近在折腾opencode的安装配置,发现手动操作实在太费时间了——要查文档、装依赖、配环境变量,一不小心就踩坑。后来发现用InsCode(快马)平台可以快速生成自动化脚本,效率直接翻倍。今天就把这个"偷懒"方案分享给大家。 环境预检查…...
避坑指南:ESP32 ADC测量不准?7个常见错误与校准优化方案
ESP32 ADC精度优化实战:从硬件设计到软件校准的完整避坑手册 当你在ESP32项目中使用ADC读取传感器数据时,是否遇到过这些情况:明明输入电压稳定,读数却像心电图一样上下跳动?同一个电路在不同开发板上测出的数值相差甚…...
