我正在用Spring Boot和Kotlin构建一个后端应用程序.我想为特定的方法实现并行执行.我try 使用协程,但底层方法同步运行.

这就是我到目前为止try 过的:

fun getXsByIds(xIds: List<String>): List<X> {
        val xList = ArrayList<X>();
        runBlocking {
            val promises = xIds.map {
                async {
                    getXById(it)
                }
            };
            
            xList.addAll((promises.awaitAll()).filterNotNull())
        }
        return xList;
    }

    fun getXById(xId: String): X? {
        // This method makes request to database
    }

当我把日志(log)放在getXById中时,

fun getXById(xId: String): X? {
        print("start");
        // This method makes request to database
        print("end");
    }

我得到了这个输出

start
end
start
end
start
end
...

为什么我的协同程序不能并行工作?这是一双弹簧靴.不是被动的.每请求线程样式.

推荐答案

调用async而不指定任何协程元素意味着它将从其父级继承所有这些元素(作业(job)除外).这会导致您的"异步"调用在runBlocking阻塞调度程序上执行.

试着用async(Dispatchers.Default) { ... }代替.

Kotlin相关问答推荐

我如何测试一个可组合组件没有显示,但如果它不存在也接受?

在Kotlin项目中使用Free Fair AspectJ插件(使用Gradle)

Kotlin 协程:flatMapLatest 什么都不发出

Kotlin:我可以将函数分配给 main 的伴随对象中的变量吗?

如何使用 Firebase 和 Kotlin 在文本 (Jetpack Compose) 中显示当前用户名?

循环中的每个元素都应填充行中可用的所有可用空间

Kotlin 数据类中的大量参数

验证构造函数中的值组合

嵌套数组 indexOf()

T except one class

Kotlin - 覆盖方法中的 IllegalArgumentException

从代码块执行和返回(在 Elvis 运算符之后)

Kotlin内联扩展属性

在java代码中使用kotlin库

Kotlin的BiMap/2-way hashmap

如何从协程范围返回值

将字符串编码为Kotlin中的UTF-8

@StringRes、@DrawableRes、@LayoutRes等android注释使用kotlin参数进行判断

Kotlin中的嵌套let块

从另一个列表创建一个列表