首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用Kotlin协程从调用挂起函数的normal函数返回值

Kotlin协程是一种轻量级的并发编程框架,可以简化异步编程的复杂性。它通过挂起函数(suspend function)来实现协程的挂起和恢复,从而避免了传统的回调地狱和线程同步的问题。

在使用Kotlin协程从调用挂起函数的normal函数返回值时,可以通过以下步骤实现:

  1. 定义一个挂起函数:首先,需要定义一个挂起函数,该函数使用suspend关键字修饰。挂起函数可以在内部使用其他挂起函数,这样就可以实现协程的串行执行。
  2. 调用挂起函数:在normal函数中,可以使用launchasync函数来调用挂起函数。launch函数用于启动一个新的协程,而async函数用于启动一个带有返回值的协程。
  3. 获取挂起函数的返回值:如果使用launch函数调用挂起函数,则无法获取其返回值。如果需要获取返回值,可以使用async函数,并通过await函数来等待协程执行完成并获取返回值。

下面是一个示例代码:

代码语言:txt
复制
import kotlinx.coroutines.*

suspend fun fetchData(): String {
    delay(1000) // 模拟耗时操作
    return "Data from fetchData"
}

fun normalFunction(): String {
    val deferred = GlobalScope.async { fetchData() }
    runBlocking {
        val result = deferred.await()
        println(result) // 打印挂起函数的返回值
    }
    return "Data from normalFunction"
}

fun main() {
    val result = normalFunction()
    println(result) // 打印normal函数的返回值
}

在上面的示例中,fetchData函数是一个挂起函数,模拟了一个耗时的操作。normalFunction函数是一个普通函数,通过async函数调用了fetchData函数,并使用await函数等待协程执行完成并获取返回值。最后,normalFunction函数返回一个字符串。

需要注意的是,为了能够使用协程,需要在项目中添加Kotlin协程库的依赖。可以参考腾讯云的云原生产品Tencent Cloud Native来部署和管理Kotlin协程相关的应用。

总结起来,使用Kotlin协程从调用挂起函数的normal函数返回值,可以通过定义挂起函数、调用挂起函数并获取返回值的方式来实现。Kotlin协程可以提高异步编程的效率和简洁性,适用于各种需要处理并发任务的场景。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Kotlin 挂起和恢复 ① ( 挂起和恢复概念 | suspend 挂起函数 )

文章目录 一、挂起和恢复概念 二、 suspend 挂起函数 一、挂起和恢复概念 ---- 函数 最基本操作 是 : 调用 call : 通过 函数名或函数地址 调用函数 ; 返回...return : 函数执行完毕后 , 继续执行函数调用下一行代码 ; 调用 call 和 返回 return 基础上 , 又新增了两种 状态 : 挂起 Suspend : 暂停当前执行..., 只能在 体内部 或者 其它挂起函数调用 ; 外部不允许使用挂起函数 ; 在中 , 执行 挂起 Suspend 函数 , 将 挂起信息 记录下来 , 然后执行耗时操作 , 执行完毕后...恢复 Resume ; 二、 suspend 挂起函数 ---- 声明挂起函数 , 使用 suspend 在 fun 关键字之前 修饰函数 , 如 : public suspend fun Test...){} 中 , 可以直接调用挂起函数 ; 挂起 函数 , 只能在 体内部 或者 其它挂起函数调用 ; 外部不允许使用挂起函数 ; 在中 , 执行 挂起 Suspend 函数 , 将 挂起信息

1.5K40

Kotlin 启动 ③ ( 组合并发 | 挂起函数串行执行 | 组合并发执行挂起函数 )

文章目录 一、挂起函数串行执行 二、组合并发执行挂起函数 一、挂起函数串行执行 ---- 在体中 , 连续使用多个挂起函数 , 这些函数执行是顺序执行 , 挂起函数 1 执行完毕后 , 才执行...runBlocking 函数 , 可以将 主线程 包装成 // measureTimeMillis 函数用于测量内部代码块执行时间, 单位毫秒 ms...3 00:14:00.963 I 挂起函数执行耗时 577 ms 二、组合并发执行挂起函数 ---- 如果想要两个挂起函数并发执行 , 并且同时需要两个函数返回值 , 则使用 async...runBlocking 函数 , 可以将 主线程 包装成 // measureTimeMillis 函数用于测量内部代码块执行时间, 单位毫秒 ms..., 并发执行两个挂起函数 , 耗时 355 ms , 达到了并发执行减少执行时间目的 ; 00:18:50.081 I 两个返回值相加 3 00:18:50.081 I 挂起函数执行耗时 355

64820

Kotlin 】Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 调用挂起函数返回集合 )

文章目录 一、以异步返回返回多个返回值 二、同步调用返回多个值弊端 三、尝试在 sequence 中调用挂起函数返回多个返回值 四、调用挂起函数返回集合 一、以异步返回返回多个返回值 ----...在 Kotlin Coroutine 中 , 使用 suspend 挂起函数 以异步方式 返回单个返回值肯定可以实现 , 参考 【Kotlin 挂起和恢复 ① ( 挂起和恢复概念...| suspend 挂起函数 ) 博客 ; 如果要 以异步方式 返回多个元素返回值 , 可以使用如下方案 : 集合 序列 Suspend 挂起函数 Flow 异步流 二、同步调用返回多个值弊端...functions can only invoke member or extension suspending functions on their restricted coroutine scope 受限挂起函数只能在其受限范围上调用成员或扩展挂起函数...---- 如果要 以异步方式 返回多个返回值 , 可以在调用挂起函数返回集合 , 但是该方案只能一次性返回多个返回值 , 不能持续不断 先后 返回 多个 返回值 ; 代码示例 : package

8.2K30

Kotlin 多路复用技术 ② ( select 函数原型 | SelectClauseN 事件 | 查看挂起函数是否支持 select )

一、select 函数原型 ---- 在上一篇博客 【Kotlin 多路复用技术 ① ( 多路复用技术 | await 多路复用 | Channel 通道多路复用 ) 中 , 介绍了...多路复用技术 , 多路复用 主要使用 select 代码块 实现 , 在 select 代码块中 调用多个协 onAwait 函数 , 哪个协先返回数据 , 就选择该数据作为返回值 ;..._clauses_指定多个挂起函数结果 * 在此选择调用[builder]范围内。...如果当前[Job]被取消或完成 * 函数挂起后,该函数立即恢复[CancellationException]。 * 有**立即取消保证**。...有返回值 , 有参数 ; 如 : Channel 通道 onSend 事件 ; 挂起函数 如果存在对应 SelectClauseN 事件 , 那么就可以使用 select 实现多路复用 ; 1、SelectClause0

1.1K20

Kotlin 取消 ② ( CPU 密集型任务取消 | 使用 isActive 判定状态 | 使用 ensureActive 函数取消协 | 使用 yield 函数取消协 )

文章目录 一、CPU 密集型任务取消 二、使用 isActive 判定当前 CPU 密集型任务是否取消 三、使用 ensureActive 自动处理退出 四、使用 yield 函数检查状态并处理取消操作...一、CPU 密集型任务取消 ---- 在 中 , 定义在 kotlinx.coroutines 包下 suspend 挂起函数 是可以取消 ; 但是有一种任务 , CPU 密集型任务...:23.680 I 退出作用域 三、使用 ensureActive 自动处理退出 ---- 在中 , 可以执行 ensureActive() 函数 , 在该函数中会 自自动判定当前...:23.680 I 退出作用域 四、使用 yield 函数检查状态并处理取消操作 ---- 在中 , 可以使用 yield() 函数 , 检查当前状态 , 如果已经调用 cancel...* * 这个暂停功能是可以取消。 * 如果在调用挂起函数时取消或完成当前[Job] * 这个函数正在等待调度,它会以[CancellationException]恢复。

1K20

Kotlin 】Flow 异步流 ⑥ ( 调用 Flow#launchIn 函数指定流收集 | 通过取消流收集所在取消流 )

文章目录 一、调用 Flow#launchIn 函数指定流收集 1、指定流收集 2、Flow#launchIn 函数原型 3、代码示例 二、通过取消流收集所在取消流 一、调用 Flow..., 开始 收集元素 , 按照顺序逐个处理产生事件 ( 元素 ) ; 调用 Flow#launchIn 函数 , 传入 作用域 作为参数 , 可以 指定 收集 Flow 流元素 ; 在上一篇博客...【Kotlin 】Flow 异步流 ⑤ 中 , 调用 Flow#flowOn 函数 , 可以 指定 Flow 流发射元素 ; Flow#launchIn 函数返回值是 Job 对象 ,...是 任务对象 , 可调用 Job#cancel 函数取消该任务 ; 2、Flow#launchIn 函数原型 Flow#launchIn 函数原型 : /** * 终端流操作符,在[作用域]中....join() // 该不是 runBlocking 主 , 需要调用 join 等待执行完毕 } } /** * 使用 flow

75720

Kotlin 取消 ③ ( finally 释放资源 | 使用 use 函数执行 Closeable 对象释放资源操作 | 构造无法取消任务 | 构造超时取消任务 )

文章目录 一、释放资源 二、使用 use 函数执行 Closeable 对象释放资源操作 三、使用 withContext(NonCancellable) 构造无法取消任务 四、使用 withTimeoutOrNull...函数构造超时取消任务 一、释放资源 ---- 如果 中途取消 , 期间需要 释放占有的资源 ; 如果执行任务中 , 需要 执行 关闭文件 , 输入输出流 等操作 , 推荐使用...withContext(NonCancellable) 构造无法取消任务 ---- 如果在 finally 中需要使用 suspend 挂起函数 , 则 挂起函数以及之后代码将不会被执行 ;...代码块代码肯定会执行 , 但是如果 finally 中 delay 挂起函数以及之后代码将不会被执行 ; 使用 withContext(NonCancellable) {} 代码块 , 可以构造一个无法取消任务...23:12:32.093 I 退出作用域 四、使用 withTimeoutOrNull 函数构造超时取消任务 ---- 使用 withTimeout 函数 , 可以构造超时取消任务

1.3K10

写给Android工程师指南

基础概念 在标准解释中,如下所示: 在中,当我们代码执行到某个位置时,可以使用特定关键字来暂停函数执行,同时保存函数执行状态,这个过程叫做 [挂起],挂起操作会将控制器交还给调用方,调用方可以继续执行其他任务...挂起函数 在上面我们聊到了 Kotlin 挂起函数,与相关 挂起 与 恢复 。那 suspend 标志到底做了什么呢? 本小节,我们将就这个问题,字节码层,展开分析。...具体来说,在被挂起时,会将当前执行状态保存到一个回调函数(即挂起函数 Continuation)中,然后将控制权交回给调用方。当准备好恢复时,它会回调函数中取回执行状态,继续执行。...对于挂起函数而言,在,是否真的被挂起,通过函数返回值来确定,但相应,如果我们有挂起函数需要具备返回类型呢?那如果该函数没有挂起呢?...在具体调用时,如果挂起函数内部真的挂起(函数返回值为 COROUTINE_SUSPENDED ),则将调用权交还给调用方,然后当前状态+1。

1.4K40

破解 Kotlin 番外篇(2) - 几类常见实现

Kotlin 是一种无栈实现,它控制流转依靠对体本身编译生成状态机状态流转来实现,变量保存也是通过闭包语法来实现,不过 Kotlin 可以在任意调用层次挂起,换句话说我们启动一个...,② 处调用才会真正挂起Kotlin 通过 suspend 函数嵌套调用方式可以实现任意函数调用层次挂起。... Python 3.5 开始也支持 async/await,原理与 JavaScript 实现类似,与 Generator 不同之处在于我们可以通过这一组关键字实现在函数嵌套调用挂起。...coroutine.yield:挂起,第一个参数为被挂起实例,后面的参数则作为外部调用 resume 来继续当前返回值,而它返回值则又是外部下一次 resume 调用时传入参数。...相比之下,有朋友抱怨 Kotlin 没有其他语言 async/await 那么容易上手,也没有 go routine 那么容易使用,原因也很简单,Kotlin 用一个最基本 suspend

1.4K31

Kotlin系列(一)

为了便于区分,我们将Kotlin基础设施层创建称为简单,将基于业务框架层创建称为复合,这一小节主要来讨论简单使用。...   其中suspend ()->T是一个被suspend修饰挂起函数,这也是执行体,不妨称作协体   参数completion会在执行完成后调用,也就是完成回调   函数返回值是一个...(4)函数挂起   我们已经知道使用suspend关键字可以声明一个挂起函数挂起函数只能在体内或其他挂起函数调用。这样一来,整个kotlin语言体系就可以分为两派:普通函数挂起函数。...在回答这个问题之前我们先来了解一个概念:挂起点,在内部挂起函数调用处被称为挂起点,只有当挂起点处发生异步调用,当前才会被挂起,直到这个协对应continuation实例resumeWith...(6)拦截器   我们现在已经知道Kotlin可以通过调用挂起函数实现挂起,可以通过Continuation恢复调用实现恢复,还知道可以通过绑定一个上下文来设置一些数据来丰富能力,

21210

kotlin 入门教程

但是我认为这种比喻不对,更好解释是kotlin 其实是 kotlin 线程池中一个任务(Task);我们能执行操作,其实是因为调用框架接口,该框架是对线程池进一步封装。...相对java线程池优势是什么 其实 kotlin 核心优势有三个,分别是:轻量、挂起函数以及结构化并发。轻量 ,很多文章都说过,这里不多介绍。...组成部分 kotlin框架主要由三部分组成:CoroutineScope(作用域)、CoroutineContext(上下文)、挂起函数。下面我们分别来介绍。...挂起函数 挂起函数是指方法声明前加上 suspend 关键字函数。它作用主要是挂起与恢复。其实说挂起和恢复比较难理解,其实简单挂起就是任务当前线程脱离,恢复则是任务回到了原线程。...getData 这个挂起函数时,主线程会切换到子线程,并执行网络请求任务;当请求任务执行完成后则回到了主线程。

15110

【说站】await在python函数使用

await在python函数使用 说明 1、await是一个只能在函数使用关键词,用于在遇到IO操作时悬挂当前(任务). 2、在悬挂当前(任务)过程中,事件循环可以执行其他...使用方法 await + 可等待对象(对象、Future对象、Task对象) 实例 import asyncio async def func():     print("执行函数内部代码")...    # 遇到IO操作挂起当前(任务),等IO操作完成之后再继续往下执行。     ...# 当前挂起时,事件循环可以去执行其他(任务)。     ...asyncio.sleep(2)     print("IO请求结束,结果为:", response) result = func() asyncio.run(result) 以上就是await在python函数使用

74540

【翻译】深入 Kotlin

那么让我们来看看具体怎样使用命令式风格写出类似的异步代码吧! 如何使用基于一种新函数类型,叫做挂起函数。我们可以在函数名称前使用一种新语言关键字 suspend 来标记。...suspend fun fetchUserData(userId: String): String { // return user String } 一个挂起函数只能被或者其他挂起函数调用....() -> T): Deferred { … } launch{} 如果你不考虑返回值,那么 launch 函数使用最简单工具。...调用 Job 类 join() 方法将暂停它所包含运行。 async{} 通过使用 async 函数你可以达到和 launch 一样效果,唯一一个非常重要差别是:它有返回值。...这个 await 函数返回值类型参数 T 现在是 continuation 里类型参数了。结尾返回值签名 Any 是用于控制运行流程。

1.4K10

破解 Kotlin (6) - 挂起

关键词:Kotlin 挂起 任务挂起 suspend 非阻塞 挂起最初是一个很神秘东西,因为我们总是用线程概念去思考,所以我们只能想到阻塞。不阻塞挂起到底是怎么回事呢?...sleep 让线程进入休眠状态,直到指定时间之后某种信号或者条件到达,线程就尝试恢复执行,而 delay 会让挂起,这个过程并不会阻塞 CPU,甚至可以说硬件使用效率上来讲是“什么都不耽误”,从这个意义上讲...简单来说就是,对于 suspend 函数,不是一定要挂起,可以在需要时候挂起,也就是要等待还没有执行完时候,等待执行完再继续执行;而如果在开始 join 或者 await 或者其他 suspend...Kotlin 下面的调用已经很接近了: suspend fun main() { log(hello()) } 只不过我们在 Kotlin 当中还是不太容易拿到 hello 在挂起真正返回值...Java 代码与前面的 Kotlin 调用完全一样。

1.1K30

Kotlin 学习笔记(四)—— 基础知识,面试官最爱了~

suspend 关键字本身没有挂起作用,需要在方法内部直接或者间接地调用 Kotlin 框架中 suspend 函数才可以。...所以,suspend 关键字更多是给调用者一个提示,提示调用者被它修饰方法是个耗时方法,需要在或者其他 suspend 函数中处理,限制这个方法只能在或其他 suspend 函数中被调用。...当挂起函数结束后程序恢复运行时,这时执行线程就是执行挂起函数线程。即挂起函数由哪个线程执行,后续就在哪个线程执行。...; UNDISPATCHED:表示创建后立即在当前函数调用栈中执行,是运行在创建时所在线程。...这是因为 await 函数也是一个挂起函数执行到 await 时会被挂起,当 async 执行完返回结果后,才会继续执行。

1.4K30

Kotlin 】Flow 异步流 ④ ( 流构建器函数 | flow 构建器函数 | flowOf 构建器函数 | asFlow 构建器函数 )

文章目录 一、流构建器函数 1、flow 构建器 2、flowOf 构建器 3、asFlow 构建器 一、流构建器函数 ---- 1、flow 构建器 在之前博客 【Kotlin 】Flow...异步流 ② ( 使用 Flow 异步流持续获取不同返回值 | Flow 异步流获取返回值方式与其它方式对比 | 在 Android 中使用 Flow 异步流下载文件 ) 【Kotlin 】Flow...挂起 500ms // 在中, 该挂起操作不会阻塞调用线程, 会继续执行其它代码指令 // 500ms 恢复执行, 继续执行挂起函数之后后续代码指令...super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 携调用挂起函数返回一个...super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 携调用挂起函数返回一个

47910

爬虫中如何解决异步函数调用遇到问题

解决方案为了解决在微信公众号爬取中使用异步函数问题,我们提供以下两种解决方案:3.1 将异步函数封装成一个库在这个方案中,我们将异步函数封装成一个独立库或模块,允许我们在微信公众号爬取项目中引入并使用它...通过这种方式,我们可以在项目中调用异步函数而不会遇到事件循环问题。...3.2 将异步函数转换为同步函数如果你不想使用中间件来处理异步操作,还可以将异步函数转换为同步函数,然后在需要使用异步函数地方,调用这些同步函数。...在需要使用异步函数地方,调用async_to_sync来处理异步操作,而无需担心事件循环问题。...通过将异步函数封装成库或将其转换为同步函数,我们可以成功解决在NumPy中使用异步函数调用时可能遇到问题。

24230

CPS(Continuation-Passing-Style, 续体传递风格)

与线程不同;首先,本质上可以认为是运行在线程上代码块,提供 挂起 操作会使暂停执行,而不会导致线程阻塞。...通过这样设计,开发者可以极大提高线程使用率,用尽量少线程执行尽量多任务,其次调用者无需在编程时思考过多资源浪费问题,可以在每当有异步或并发需求时候就不假思索开启。...这就是CPS风格,函数结果通过回调来传递, 里通过在CPSContinuation回调里结合状态机流转,来实现挂起-恢复功能....在 await 函数挂起结束以后,它会调用 continuation 参数 resumeWith 函数,来恢复执行 await 函数后面的代码。...在挂起函数编译中,每个挂起函数都会被编译为一个实现了 Continuation 接口匿名类,而续体拦截器会拦截真正挂起挂起续体。

2.3K30

Kotlin解析系列(上):调度与挂起

挂起函数只能在或另一个挂起函数中被调用,如果你在非使用到了挂起函数,会报错。...“挂起”是指它当前线程脱离,切换到另一个线程运行。当线程运行到suspend函数时,会暂时挂起这个函数及后续代码执行。简而言之,挂起函数是一个可以启动、暂停和恢复函数。...【suspend】:挂起或暂停,用于挂起执行当前,并保存所有局部变量 【resume】:恢复,用于让已挂起挂起处恢复继续执行 挂起(暂停)时,会复制并保存当前堆栈帧以供稍后使用,将信息保存到...这个函数只能在或者挂起函数中执行,说明Continuation很有可能是中传入来,查看构建源码。...挂起函数并一定都会挂起,例如await()挂起函数如果返回值不等于IntrinsicsKt.getCOROUTINE_SUSPENDED(),则继续执行挂起点之后逻辑。

1.8K40
领券