Kotlin coroutineScope 应该同时调用所有异步函数
Kotlin coroutineScope supposed to call all async functions concurrently
我是 Kotlin 新手,coroutines。
我有以下代码:
fun asyncCallForRelationIdList(relationIds: List<String>): List<Any?> = runBlocking {
println("Starting asynchronous code flow")
asyncCallForUserIdList(relationIds)
}
suspend fun asyncCallForUserIdList(userIds: List<String>): List<Any?> = coroutineScope {
println("Elements in list are supposed to call api concurrently")
val listval = mutableListOf<Any?>()
val result0 = async {restApiCall(relationId = userIds[0])}
val result1 = async {restApiCall(relationId = userIds[1])}
listval.add(result0.await())
listval.add(result1.await())
listval.toList()
}
suspend fun restApiCall(relationId: String): Any? {
println("api call... the api will timeout with an artificial delay")
//api call
//return "api result"
}
asyncCallForRelationIdList()
函数将调用 asyncCallForUserIdList()
,然后调用 API 将超时。
我的问题是关于我在 coroutineScope
中使用的 async
关键字。我希望 2 个异步调用同时发生。但这里不是这种情况。在第一次 api 调用后,线程等待服务超时,而不是同时进行第二次 api 调用。为什么?
您正在使用 运行Blocking,因此它会一个接一个地阻塞主线程和 运行。它不是启动异步代码流。
将您的异步调用更改为 async(Dispatchers.IO) { ... } 因为它们实际上不是异步的,目前它们 运行 在 runBlocking
的范围内
感谢@Pawel
我是 Kotlin 新手,coroutines。
我有以下代码:
fun asyncCallForRelationIdList(relationIds: List<String>): List<Any?> = runBlocking {
println("Starting asynchronous code flow")
asyncCallForUserIdList(relationIds)
}
suspend fun asyncCallForUserIdList(userIds: List<String>): List<Any?> = coroutineScope {
println("Elements in list are supposed to call api concurrently")
val listval = mutableListOf<Any?>()
val result0 = async {restApiCall(relationId = userIds[0])}
val result1 = async {restApiCall(relationId = userIds[1])}
listval.add(result0.await())
listval.add(result1.await())
listval.toList()
}
suspend fun restApiCall(relationId: String): Any? {
println("api call... the api will timeout with an artificial delay")
//api call
//return "api result"
}
asyncCallForRelationIdList()
函数将调用 asyncCallForUserIdList()
,然后调用 API 将超时。
我的问题是关于我在 coroutineScope
中使用的 async
关键字。我希望 2 个异步调用同时发生。但这里不是这种情况。在第一次 api 调用后,线程等待服务超时,而不是同时进行第二次 api 调用。为什么?
您正在使用 运行Blocking,因此它会一个接一个地阻塞主线程和 运行。它不是启动异步代码流。
将您的异步调用更改为 async(Dispatchers.IO) { ... } 因为它们实际上不是异步的,目前它们 运行 在 runBlocking
的范围内感谢@Pawel