Kotlin协程-异步等待

朱利安议会

Roman Elizarov在有关Kotlin中的结构化并发的文章(https://medium.com/@elizarov/structured-concurrency-722d765aa952)中,通过以下示例解释了并行分解:

coroutineScope { 
    val deferred1 = async { loadImage(name1) }
    val deferred2 = async { loadImage(name2) }
    combineImages(deferred1.await(), deferred2.await())
}

显然,此代码是不言自明的。但是,如果我们改写这个,我们会得到相同的结果

coroutineScope { 
    val result1 = async { loadImage(name1) }.await()
    val result2 = async { loadImage(name2) }.await()
    combineImages(result1, result2)
}

意思是,两个异步都会仍然并行运行,还是第二个异步调用永远不会运行,直到result1可用?

埃迪·道德

范例1:

fun main(args: Array<String>) = runBlocking<Unit> {
    val time = measureTimeMillis {
        val one = async {
            delay(1000)
            return@async 1
        }
        val two = async {
            delay(3000)
            return@async 2
        }
        println("The answer is ${one.await() + two.await()}")
    }
    println("Completed in $time ms")
}

结果1:

The answer is 3
Completed in 3041 ms

范例2:

fun main(args: Array<String>) = runBlocking<Unit> {
    val time = measureTimeMillis {
        val one = async {
            delay(1000)
            return@async 1
        }.await()
        val two = async {
            delay(3000)
            return@async 2
        }.await()
        println("The answer is ${one + two}")
    }
    println("Completed in $time ms")
}

结果2:

The answer is 3
Completed in 4043 ms

查阅此链接以获取有关使用异步并发的官方文档

结论

async-await-async-await将产生纯顺序代码

async-async-await-await将并行运行

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章