Котлин сопрограммы - Async Await - PullRequest
0 голосов
/ 03 октября 2018

В своей статье о структурированном параллелизме в Котлине (https://medium.com/@elizarov/structured-concurrency-722d765aa952), Роман Елизаров объясняет параллельную декомпозицию, приводя следующий пример:

coroutineScope { 
    val deferred1 = async { loadImage(name1) }
    val deferred2 = async { loadImage(name2) }
    combineImages(deferred1.await(), deferred2.await())
}

Очевидно, этот код не требует пояснений. Однако мы будемполучить тот же результат, если мы напишем это вместо

coroutineScope { 
    val result1 = async { loadImage(name1) }.await()
    val result2 = async { loadImage(name2) }.await()
    combineImages(result1, result2)
}

То есть будет ли асинхронный процесс выполняться параллельно или 2-й асинхронный вызов никогда не будет выполняться до тех пор, пока не будет доступен результат1?

1 Ответ

0 голосов
/ 03 октября 2018

Пример 1:

fun main(args: Array<String>) = runBlocking<Unit> {
    val time = measureTimeMillis {
        val one = async {
            delay(1000)
            return@async 1
        }
        val two = async {
            delay(3000)
            return@async 2
        }
        println("The answer is ${one.await() + two.await()}")
    }
    println("Completed in $time ms")
}

Результат 1:

The answer is 3
Completed in 3041 ms

Пример 2:

fun main(args: Array<String>) = runBlocking<Unit> {
    val time = measureTimeMillis {
        val one = async {
            delay(1000)
            return@async 1
        }.await()
        val two = async {
            delay(3000)
            return@async 2
        }.await()
        println("The answer is ${one + two}")
    }
    println("Completed in $time ms")
}

Результат 2:

The answer is 3
Completed in 4043 ms

Проверьте эту ссылку для официальной документации для Одновременное использование async

Заключение

async-await-async-await приведет к чисто последовательномукод

async-async-await-await будет работать параллельно

...