gpt4 book ai didi

kotlin - 在 Kotlin 中,如何传递参数以便异步作用域保留它?

转载 作者:行者123 更新时间:2023-12-01 00:26:10 25 4
gpt4 key购买 nike

我有以下使用 Kotlin Coroutines 的代码片段

fun main(args:Array<String>){
println("test")

var seed = 3
val deferredResult = async(CommonPool){
seed * 2
}

seed = 4

runBlocking(CommonPool) {
val result = deferredResult.await()
println("Result is $result")
}

println("end")
}

我期待它的行为像 javascript 并保留 seed 的值定义协程时的变量(使用副本)。但不是打印 Result is 6 ,它打印 Result is 8 .

我该怎么做才能确保在异步范围内(而不是 4)使用种子变量的原始值(即 3)?

最佳答案

让我们看一个非多线程示例,这将使它更清楚:

fun main(args:Array<String>){
println("test")

var seed = 3 // @1. initializing seed=3
val deferredResult = {
seed * 2 // @4. seed=4 then
}

seed = 4 // @2. reassign seed=4

// v--- @3. calculates the result
val result = deferredResult()
// ^--- 8
println("Result is $result");
}

如您所见,序列开始 @显然,在非多线程中描述的 lambda 是懒惰地调用的。这意味着除非调用者调用它,否则不会调用 lambda 的主体。

多线程结果不确定,可能是 68 ,因为这取决于是否是序列 @2或序列 @4首先被调用。当我们调用 async(..)在池中启动一个线程需要一些时间,当前线程在线程运行之前不会阻塞。

它在 中也有问题, 例如:
var seed = 3

function deferredResult() {
return seed * 2
}

seed = 4

var result = deferredResult()
console.log("Result is " + result);// result is also 8

它通过在javascript中引入另一个调用内联匿名函数来解决。您也可以像在 javascript 中一样使用 lambda 在 kotlin 中解决它:
fun main(args: Array<String>) {
println("test")

var seed = 3
// v--- like as javascript (function(seed){...})(seed);
val deferredResult = ({ seed: Int ->
async(CommonPool) {
seed * 2
}
})(seed);

seed = 4

runBlocking(CommonPool) {
val result = deferredResult.await()
// ^--- result is always 6 now
println("Result is $result")
}

println("end")
}

关于kotlin - 在 Kotlin 中,如何传递参数以便异步作用域保留它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44747175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com