Код IT
← Каталог

Kotlin — последовательно и async/awaitAll

Корутины: последовательный delay и параллельный async + awaitAll для пачки загрузок.

kotlin asyncconcurrencyencyclopedia3 embed URL статья в энциклопедии
Kotlin main.kt
/**
 * Практикум: https://spirzen.ru/encyclopedia/4-code-dev/4-05-asinhronnost/3
 *
 * Зависимость: org.jetbrains.kotlinx:kotlinx-coroutines-core
 */
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking

suspend fun download(url: String, delayMs: Long): String {
    delay(delayMs)
    return "Данные с $url"
}

suspend fun loadAllSequential(urls: List<Pair<String, Long>>) {
    println("\n1. ПОСЛЕДОВАТЕЛЬНО")
    val start = System.currentTimeMillis()
    urls.forEach { (url, ms) ->
        download(url, ms)
        println("  Готово: $url")
    }
    val elapsed = System.currentTimeMillis() - start
    println("  Время: ${elapsed / 1000.0} с")
}

suspend fun loadAllParallel(urls: List<Pair<String, Long>>) = coroutineScope {
    println("\n2. ПАРАЛЛЕЛЬНО (async + awaitAll)")
    val start = System.currentTimeMillis()
    urls
        .map { (url, ms) ->
            async {
                val data = download(url, ms)
                println("  Готово: $url")
                data
            }
        }
        .awaitAll()
    val elapsed = System.currentTimeMillis() - start
    println("  Время: ${elapsed / 1000.0} с")
}

fun main() = runBlocking {
    val urls = listOf(
        "https://example.com/page1" to 2000L,
        "https://example.com/page2" to 3500L,
        "https://example.com/page3" to 1500L,
        "https://example.com/page4" to 2500L,
        "https://example.com/page5" to 1000L,
    )

    println("=== Kotlin — sequential vs async/awaitAll ===")
    loadAllSequential(urls)
    loadAllParallel(urls)
}
/**
 * Практикум: https://spirzen.ru/encyclopedia/4-code-dev/4-05-asinhronnost/3
 *
 * Зависимость: org.jetbrains.kotlinx:kotlinx-coroutines-core
 */
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking

suspend fun download(url: String, delayMs: Long): String {
    delay(delayMs)
    return "Данные с $url"
}

suspend fun loadAllSequential(urls: List<Pair<String, Long>>) {
    println("\n1. ПОСЛЕДОВАТЕЛЬНО")
    val start = System.currentTimeMillis()
    urls.forEach { (url, ms) ->
        download(url, ms)
        println("  Готово: $url")
    }
    val elapsed = System.currentTimeMillis() - start
    println("  Время: ${elapsed / 1000.0} с")
}

suspend fun loadAllParallel(urls: List<Pair<String, Long>>) = coroutineScope {
    println("\n2. ПАРАЛЛЕЛЬНО (async + awaitAll)")
    val start = System.currentTimeMillis()
    urls
        .map { (url, ms) ->
            async {
                val data = download(url, ms)
                println("  Готово: $url")
                data
            }
        }
        .awaitAll()
    val elapsed = System.currentTimeMillis() - start
    println("  Время: ${elapsed / 1000.0} с")
}

fun main() = runBlocking {
    val urls = listOf(
        "https://example.com/page1" to 2000L,
        "https://example.com/page2" to 3500L,
        "https://example.com/page3" to 1500L,
        "https://example.com/page4" to 2500L,
        "https://example.com/page5" to 1000L,
    )

    println("=== Kotlin — sequential vs async/awaitAll ===")
    loadAllSequential(urls)
    loadAllParallel(urls)
}