Tiny project with sample of call a suspend function in Kotlin.
Links:
Piece of code:
package com.gitlab.denissov.kcoroutines
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
val operationsCount = 0..5
fixExecutionTime("synchronous") {
operationsCount.forEach { index ->
println(longTimeMethod("A", index))
println(longTimeMethod("B", index))
}
}
fixExecutionTime("asynchronous") {
operationsCount.forEach { index ->
val resultA = async { longTimeMethod("A", index) }
val resultB = async { longTimeMethod("B", index) }
awaitAll(resultA, resultB).forEach {
println(it)
}
}
}
fixExecutionTime("asynchronous all") {
val results = operationsCount.map { index ->
listOf(
async {
longTimeMethod("A", index)
},
async {
longTimeMethod("B", index)
}
)
}.flatten()
awaitAll(*results.toTypedArray()).forEach {
println(it)
}
}
}
private suspend fun longTimeMethod(prefix: String, index: Int): String {
// Simulate waiting for a network request to respond or performing complex work on the CPU
delay(1_000)
return shortTimeMethod(prefix, System.currentTimeMillis(), index)
}
private fun shortTimeMethod(prefix: String, time: Long, index: Int): String =
"Call $prefix:$index returns result at $time ms"
private suspend fun fixExecutionTime(blockName: String, block: suspend () -> Unit) {
val startTime = System.currentTimeMillis()
println("start: $blockName")
block()
println("complete $blockName execution time: ${System.currentTimeMillis() - startTime} ms")
}
Result:
start: synchronous
Call A:0 returns result at 1584528958292 ms
Call B:0 returns result at 1584528959294 ms
Call A:1 returns result at 1584528960297 ms
Call B:1 returns result at 1584528961298 ms
Call A:2 returns result at 1584528962302 ms
Call B:2 returns result at 1584528963305 ms
Call A:3 returns result at 1584528964309 ms
Call B:3 returns result at 1584528965310 ms
Call A:4 returns result at 1584528966311 ms
Call B:4 returns result at 1584528967313 ms
Call A:5 returns result at 1584528968315 ms
Call B:5 returns result at 1584528969317 ms
complete synchronous execution time: 12028 ms
start: asynchronous
Call A:0 returns result at 1584528970328 ms
Call B:0 returns result at 1584528970328 ms
Call A:1 returns result at 1584528971333 ms
Call B:1 returns result at 1584528971333 ms
Call A:2 returns result at 1584528972336 ms
Call B:2 returns result at 1584528972337 ms
Call A:3 returns result at 1584528973338 ms
Call B:3 returns result at 1584528973338 ms
Call A:4 returns result at 1584528974343 ms
Call B:4 returns result at 1584528974343 ms
Call A:5 returns result at 1584528975345 ms
Call B:5 returns result at 1584528975345 ms
complete asynchronous execution time: 6027 ms
start: asynchronous all
Call A:0 returns result at 1584528976366 ms
Call B:0 returns result at 1584528976366 ms
Call A:1 returns result at 1584528976366 ms
Call B:1 returns result at 1584528976366 ms
Call A:2 returns result at 1584528976366 ms
Call B:2 returns result at 1584528976366 ms
Call A:3 returns result at 1584528976366 ms
Call B:3 returns result at 1584528976366 ms
Call A:4 returns result at 1584528976366 ms
Call B:4 returns result at 1584528976367 ms
Call A:5 returns result at 1584528976367 ms
Call B:5 returns result at 1584528976367 ms
complete asynchronous all execution time: 1020 ms
Code available at Repository