Kotlin runBlocking和异步返回
我在kotlin合作项目中迈出了第一步,我遇到了一个问题 为了创建Kotlin runBlocking和异步返回,kotlin,coroutine,kotlin-coroutines,Kotlin,Coroutine,Kotlin Coroutines,我在kotlin合作项目中迈出了第一步,我遇到了一个问题 为了创建Foo并从函数返回它,我需要异步调用两个重载服务方法,以获取Foo创建的一些值。这是我的代码: return runBlocking { val xAsync = async { service.calculateX() } val yAsync = async { service.calculateY() }
Foo
并从函数返回它,我需要异步调用两个重载服务方法,以获取Foo
创建的一些值。这是我的代码:
return runBlocking {
val xAsync = async {
service.calculateX()
}
val yAsync = async {
service.calculateY()
}
Foo(xAsync.await(), yAsync.await())
};
然而,在阅读日志之后,我觉得
calculateX()
和calculateY()
是同步调用的。我的代码正确吗?您的代码并不完美,但就同时运行calculateX()
和calculateY()
而言,它是正确的。但是,由于它在单线程的runBlocking
dispatcher上启动此并发工作,并且由于您的重量级操作是阻塞而不是挂起,因此它们不会被并行化
首先要注意的是,与使用Java执行器的老式方法相比,阻塞操作不能从协同路由中获得任何好处,除了一点简单的API
第二个观察结果是,通过使用IO dispatcher,您至少可以使它们并行运行,每个线程阻塞自己的线程:
return runBlocking {
val xAsync = async(Dispatchers.IO) {
service.calculateX()
}
val yAsync = async(Dispatchers.IO) {
service.calculateY()
}
Foo(xAsync.await(), yAsync.await())
};
与使用java.util.concurrent
API相比,这里您受益于库的IO调度程序,而不必创建自己的线程池