Führen Sie zwei Kotlin-Coroutinen innerhalb der Coroutine parallel aus

Lesezeit: 2 Minuten

Ich habe zwei Suspend-Funktionen:

suspend fun sendData() : Boolean 

suspend fun awaitAcknowledge() : Boolean

und ich möchte sie in eine dritte Suspend-Funktion packen, in der sie parallel ausgeführt werden sollen, und ich möchte das Endergebnis berechnen, indem ich beide Rückgabewerte habe:

suspend fun sendDataAndAwaitAcknowledge() : Boolean {
    // TODO execute both in parallel and compare both results
}

Aber wenn ich das so schreibe,

suspend fun sendDataAndAwaitAcknowledge() : Boolean {
    val sendResult = sendData()
    val receiveAck = awaitAcknowledge()
}

Die Funktionen werden in einer seriellen Reihenfolge ausgeführt, was in meinem Fall nicht funktioniert.

Von RxJava kommend möchte ich so etwas erreichen zip Operator:

Single.zip(awaitAcknowledge(), sendData(), {receiveAck, sendResult -> ...})

Wie kann ich das mit Coroutines?

Sie können verwenden awaitAll zu diesem Zweck:

import kotlinx.coroutines.*

suspend fun sendDataAndAwaitAcknowledge() = coroutineScope {
    awaitAll(async {
        awaitAcknowledge()
    }, async {
        sendData()
    })
}

fun sendData() = true

fun awaitAcknowledge() = false

fun main() {
    runBlocking {
        println(sendDataAndAwaitAcknowledge()) // [false, true]
    }
}

  • Ist es möglich, alle Funktionen gleichzeitig ohne Millisekunden Verzögerung auszuführen?

    – Raj

    28. März um 7:26 Uhr

Verwenden Sie wie dieses Muster:

    suspend fun sendDataAndAwaitAcknowledge() {
     val one = async { sendData() }
     val two = async { awaitAcknowledge() }
     println("The result is ${one.await() + two.await()}")
    }

Wie Sie sehen können, werden in der dritten zwei Suspendierungsfunktionen aufgerufen und parallel dazu wartet der dritte Suspendierungsspaß darauf, dass die beiden anderen ihre Aufgaben erledigen.

  • Sie können nicht einfach verwenden async. Sie benötigen dafür einen Koroutinenbereich

    – Andrej Tanana

    12. August 2019 um 7:39 Uhr

  • @AndreiTanana, überprüfe den Link. kotlinlang.org/docs/reference/coroutines/…

    Benutzer3089483

    12. August 2019 um 7:55 Uhr


  • Dies ist der vollständige Code dieses Beispiels github.com/kotlin/kotlinx.coroutines/blob/master/… es benutzt runBlocking Umfang

    – Andrej Tanana

    12. August 2019 um 8:03 Uhr

  • Hmm, wenn ich versuche, auf diese Weise umzusetzen, bekomme ich unresolved reference auf der async Stichwort. Allerdings bekomme ich keinen Importvorschlag von Android Studio.

    – Christoph

    12. August 2019 um 8:48 Uhr

  • Der async Hier wird ein statischer Import von verwendet GlobalScope, was keine großartige Sache ist. Async sollte aus einem granulareren Coroutine-Bereich heraus gestartet werden.

    – afollestad

    19. Mai 2022 um 0:47 Uhr


1448670cookie-checkFühren Sie zwei Kotlin-Coroutinen innerhalb der Coroutine parallel aus

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy