Articles of coroutine

Возврат значения, полученного в Kotlin coroutine

Я пытаюсь вернуть значение, полученное из сопрограммы fun nonSuspending (): MyType { launch(CommonPool) { suspendingFunctionThatReturnsMyValue() } //Do something to get the value out of coroutine context return somehowGetMyValue } Я придумал следующее решение (не очень безопасно!): fun nonSuspending (): MyType { val deferred = async(CommonPool) { suspendingFunctionThatReturnsMyValue() } while (deferred.isActive) Thread.sleep(1) return deferred.getCompleted() } Я […]

Параллельная загрузка файлов S3 через Kotlin Corouts

Мне нужно загрузить много файлов на S3, для завершения этой работы потребуется несколько часов. Это то, что превосходит новые сопрограммы Kotlin, поэтому я хотел дать им первую попытку вместо того, чтобы снова возиться с какой-то службой исполнения на основе Thread. Вот мой (упрощенный) код: fun upload(superTiles: Map<Int, Map<Int, SuperTile>>) = runBlocking { val s3 = […]

Не выходите из программы Kotlin, пока выполняется несколько сопрограмм

В нескольких точках моей программы я launch чтобы запустить сопрограмму, которая выполняет некоторые фоновые задачи. Затем, в какой-то момент, я возвращаюсь от main функции. Упрощенная версия моей программы может выглядеть так: fun main(args : Array<String>) { launch { delay(10000) // some long running operation println("finished") } } Теперь сопрограммы запускаются так, как ожидалось, и запускают […]

Котлин: пропуская коротины

Я играю с Kotlin и Coroutines в своем демо-приложении для Android. Вот что я имею: fun testCoroutine3() = runBlocking { var num = 0 val jobs = List(10_000) { // create a lot of coroutines and list their jobs. launch(CommonPool) { delay(1000L) println(num++) } } for(job in jobs) { job.join() //wait for all jobs to […]

COROUTINE_SUSPENDED и suspendCoroutineOrReturn в Котлине

Идея сопрограммы в котлине заключалась в том, чтобы отвлечь понятие подвески и обратных вызовов и написать простой последовательный код. Вам не нужно беспокоиться о том, приостановлена ​​ли сопрограмма или нет, подобно потокам. Какова цель suspendCoroutineOrReturn и COROUTINE_SUSPENDED и в каком случае вы могли бы использовать их?

В Kotlin, как передать параметр, чтобы асинхронная область сохранила его?

У меня есть следующий фрагмент кода, использующий Kotlin Coroutines fun main(args:Array<String>){ println("test") var seed = 3 val deferredResult = async(CommonPool){ seed * 2 } seed = 4 runBlocking(CommonPool) { val result = deferredResult.await() println("Result is $result") } println("end") } Я ожидал, что он будет вести себя как javascript и сохранит значение переменной seed (используйте копию) […]

отношения kotlin coroutine и основного обработчика

У меня есть следующий фрагмент verticalLayout { gravity = Gravity.CENTER button("BUTTON").onClick { trace("click on process") runBlocking { trace("blocking start") // #1 delay(20000L) #2 trace("blocking end") // #3 } trace("click process end") } } trace – это функция, определенная как служебная функция для вывода сообщений с использованием Log.e с текущим именем потока когда я нажимаю кнопку, […]

Как сопрограммы могут быть быстрее, чем потоки?

Я пытаюсь найти ситуацию, когда изменение многопоточности на сопрограммы ускорит обработку затронутого раздела кода. Насколько я понял, что сопрограммы используют меньше CPU и пространства кучи по сравнению с потоками, я все еще не могу найти случай, когда сопрограммы быстрее, чем потоки. Хотя я знаю, что создание сопрограмм и контекст-коммутация намного дешевле, чем соответствующие операции с […]

При использовании сопрограмм kotlin, как я могу тестировать функцию, вызывающую функцию приостановки?

У меня такой класс class SomeClass { fun someFun() { // … Some synchronous code async { suspendfun() } } private suspend fun suspendFun() { dependency.otherFun().await() // … other code } } Я хочу, чтобы unit test someFun() поэтому я написал модульный тест, который выглядит следующим образом: @Test fun testSomeFun() { runBlocking { someClass.someFun() } […]

Почему невозможно использовать ссылки на методы `suspend` в Kotlin?

У меня есть список экземпляров Job которые я хочу отменить в какой-то момент после запуска. Это выглядит следующим образом: val jobs = arrayListOf<Job>() //launch and add jobs… jobs.forEach { it.cancelAndJoin() } // cancels the jobs and waits for completion К сожалению, здесь нельзя использовать ссылку на метод. Причина: cancelAndJoin – функция suspend , так как […]