web-dev-qa-db-ja.com

コルーチン内の2つのコトリンコルーチンを並列に実行します

私は2つの中断機能を持っています:

suspend fun sendData() : Boolean 

suspend fun awaitAcknowledge() : Boolean
 _

そして、それらを並列に実行する必要がある3番目のサスペンド関数でそれらをラップしたい、そして両方の戻り値を持つことによって最終結果を計算したいです。

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

しかし、私がそのように書いたら、

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

関数はシリアル順序で実行され、私の場合は機能しません。

Rxjavaから来て、Zip演算子のようなものを達成したいと思います。

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

Coroutinesでこれを行うにはどうすればいいですか?

9
Christopher

このパターンのように使う:

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

ご覧のとおり、2つのサスペンド関数は3番目の1つで、並行して呼ばれ、3番目の中断の楽しみは2人の他のタスクを終了するのを待ちます。

0
user3089483