Kotlin Coroutines包下的select函数简介

news2024/12/23 21:01:18

在工作中,发现了kotlin Coroutines包下有大量功能非常强大的API,这篇文章中,我们主要来聊一聊select函数

1. 什么是select函数

想象一下这个场景,在程序应用中,为了实现一个业务逻辑,你可能有好几种方式来实现,但是我只需要最快实现结果的一种方式,这时候我们就可以使用select函数了。如果还不是很清楚啥意思,我们可以看下图:

最近黄金比较贵,我们的客户端需要实时查询黄金的价格,现在网易服务器和头条服务器都同时提供查询的接口,在同一时间节点上理论上网易服务器和头条服务器返回的数据应该是一样的,我此时同时向网易和头条服务器发送请求数据,那么我此时查询只需要最快返回结果即可。形象一点,我们可以理解为数据的军备竞赛。当然,使用我们现有的知识,完成这个也算是比较容易,使用两个线程然后加上回调即可,但是我来介绍一下如何使用select函数把逻辑做得更优雅一点。

2. 如何使用

来个简单的例子,按照上面的逻辑,我们来查查黄金的价格:

定义两个模拟函数,分别模拟向网易和头条获取黄金数据:

private suspend fun requestNestGoldData() = withContext(Dispatchers.IO){
        Log.d("select","start to request nest gold data")
        delay(100)

        Log.d("select","get the nest gold data success")
        "nest_" + 600.00
}

private suspend fun requestByteDanceData() = withContext(Dispatchers.IO) {
        Log.d("select","start to request byte dance gold data")
        delay(300)

        Log.d("select","get the nest gold byte dance success")
        "bytedance_" + 600.00
}

然后我们使用select函数进行绑定并获取数据:

viewModelScope.launch {

  val requestDataResult = select {

     async { requestNestGoldData() }.onAwait { it }

     async { requestByteDanceData() }.onAwait { it }

   }

   Log.d("select","get the result : $requestDataResult")
}

然后我们来看一下打印日志:

2023-09-17 15:54:23.164 19063-19188 select   D  start to request nest gold data
2023-09-17 15:54:23.164 19063-19189 select   D  start to request byte dance gold data
2023-09-17 15:54:23.266 19063-19188 select   D  get the nest gold data success
2023-09-17 15:54:23.449 19063-19063 select   D  get the result : nest_600.0
2023-09-17 15:54:23.466 19063-19188 select   D  get the nest gold byte dance success

通过日志我们发现,我们的requestNestGoldData()requestByteDanceData()同时进行了请求,但是select的结果中只返回了最快的结果,当然速度慢的接口依然还在执行,只是结果丢弃了。

3. 后续

如果我们使用 回调应该怎么做呢?不妨来写一写它的伪代码实现:

interface ResultListener {
  
  fun onResult(info String)
 
}

private suspend fun requestNestGoldDataWithListener(listner : Resultlistener) {
        runBlocking(Dispatchers.IO){
            Log.d("select","start to request nest gold data")
            delay(100)

            Log.d("select","get the nest gold data success")
            listner.onResult("nest_" + 600.00)
        }
}

private suspend fun requestByteDanceGoldDataWithListener(listner : Resultlistener) {
        runBlocking(Dispatchers.IO){
            Log.d("select","start to request byte dance gold data")
            delay(100)

            Log.d("select","get the nest byte dance data success")
            listner.onResult("nest_" + 600.00)
        }
}


viewModelScope.launch {
  
  var hasResult : Boolean = false 

	val listener : ResultListener = object : ResultListener {
    	override 	fun onResult(info String){
        	if(!hasResult) {
            hasResult = true 
            //deal with the result
          }
      }
  }
  
  requestNestGoldDataWithListener(listener)
  requestByteDanceGoldDataWithListener(listener
}

伪代码出来了,可以看出,过程还是十分容易的,此时可能还不能看出使用回调和select的区别,但是如果我们同时存在5条链路进行数据请求时,此时我们就可以看到select的简洁和强大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1021206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

石河子大学《乡村振兴战略下传统村落文化旅游设计》许少辉博士新著——2023学生开学季辉少许

石河子大学《乡村振兴战略下传统村落文化旅游设计》许少辉博士新著——2023学生开学季辉少许

LLM预训练之RLHF(一):RLHF及其变种

在ChatGPT引领的大型语言模型时代,国内外的大模型呈现爆发式发展,尤其是以年初的LLaMA模型为首的开源大模型和最近百川智能的baichuan模型,但无一例外,都使用了「基于人类反馈的强化学习」(RLHF)来提升语言…

football 篮球数据集-目标检测548张

“篮球(basketball),是以手为中心的身体对抗性体育运动,是奥运会核心比赛项目。1891年12月21日,由美国马萨诸塞州斯普林菲尔德基督教青年会训练学校体育教师詹姆士奈史密斯发明。1896年,篮球运动传入中国天…

扩散原理详解与实战

学习一下扩散模型的数学原理。 前向扩散 q ( x t ∣ x 0 ) N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) q\left(\mathbf{x}_t \mid \mathbf{x}_0\right)\mathcal{N}\left(\mathbf{x}_t ; \sqrt{\bar{\alpha}_t} \mathbf{x}_0,\left(1-\bar{\alpha}_t\right) \mathbf{I}\rig…

【Graph Net学习】GNN/GCN代码实战

一、简介 GNN(Graph Neural Network)和GCN(Graph Convolutional Network)都是基于图结构的神经网络模型。本文目标就是打代码基础,未用PyG,来扒一扒Graph Net两个基础算法的原理。直接上代码。 二、代码 …

Vue3记录

Vue3快速上手 1.Vue3简介 2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王)耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址:https://github.com/vuejs/vue-next/releas…

使用Python构建网络爬虫:从网页中提取数据

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 网络爬虫是一种强大的工…

libevent学习——Reactor模式

Reactor模式 Reator的事件处理机制 Reactor翻译为“反应堆”,是一种事件驱动机制。该机制和普通函数调用的不同在于:应用程序不是主动调用某个API完成处理,相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接…

前后端分离毕设项目之基于springboot+vue的笔记记录分享网站设计与实现(内含源码+文档+部署教程)

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

练习敲代码速度

2023年9月18日,周一晚上 今晚不想学习,但又不想玩游戏,于是找了一些练习敲代码的网站来玩玩,顺便练习一下敲代码的速度 目录 参考资料个人推荐第一个 第二个第三个 参考资料 电脑打字慢,有哪些比较好的练打字软件&a…

xxl-job的原理(1)

xxl-job的架构 系统组成 调度中心:进行任务统一调度,可以新增和管理执行器和任务;执行器:任务执行依赖的组件,一个执行器可以关联多个任务,添加的执行器可以自动注册到调度中心上;任务&#x…

全国职业技能大赛云计算--高职组赛题卷②(私有云)

全国职业技能大赛云计算--高职组赛题卷②(私有云) 第一场次题目:OpenStack平台部署与运维任务1 基础运维任务(5分)任务2 OpenStack搭建任务(15分)任务3 OpenStack云平台运维(15分&am…

mysq 主从同步错误之 Error_code 1032 handler error HA_ERR_KEY_NOT_FOUND

错误说明: MySQL主从同步的1032错误,一般是指要更改的数据不存在,SQL_THREAD提取的日志无法应用故报错,造成同步失败 (Update、Delete、Insert一条已经delete的数据)。 1032的错误本身对数据一致性没什么影…

VScode断点调试vue

VScode断点调试vue 1、修改launch.js文件(没有这个文件就新建)。 {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlin…

ChatGLM 通俗理解大模型的各大微调方法:从LoRA、QLoRA到P-Tuning V1/V2

前言 PEFT 方法仅微调少量(额外)模型参数,同时冻结预训练 LLM 的大部分参数 第一部分 高效参数微调的发展史 1.1 Google之Adapter Tuning:嵌入在transformer里 原有参数不变 只微调新增的Adapter 谷歌的研究人员首次在论文《Parameter-Efficient Transfer Learning for N…

CSS选择器练习小游戏

请结合CSS选择器练习小游戏进行阅读(网页的动态效果是没有办法通过静态图片展示的) 网址:请点击 有些题有多种答案,本文就不一一列出了 第一题 答案:plate第二题 答案:bento第三题 答案:#fa…

前后端分离管理系统day01---Springboot+MybatisPlus

目录 目录 软件 基础知识 一创建后端项目 注意: 删除多余项 创建测试类 二 加入mybatis-plus依赖支持 1.加入依赖码 2.创建数据库实例/创建用户表/插入默认数据 创建数据库实例 创建表 插入数据 3.配置yml文件 注意:wms01必须是数据库的名字&…

JVM——8.内存分配方式

这篇文章我们来讲一下jvm的内存分配方式 目录 1.概述 1.1jvm运行时数据区 1.2堆空间的分代 1.3对象分配的整体流程 2.具体的内存分配方式 2.1指针碰撞法 2.2空闲列表法 2.3Java虚拟机选择策略 3.小结 1.概述 我们前面在GC那篇文章中写了JVM的内存分配策略&#xff0…

计算机竞赛 深度学习 opencv python 实现中国交通标志识别

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 🔥 优质…

JWT~~

概述 回顾登录的流程: 接下来的问题是:这个出入证(令牌)里面到底存啥? 一种比较简单的办法就是直接存储用户信息的JSON串,这会造成下面的几个问题: 非浏览器环境,如何在令牌中记录…