ノンブロッキングI/Oを処理するためにコトリンコルーチンを使用しようとしています。次のようなシナリオは次のとおりです。Kotlin:ノンブロッキングI/Oでコルーチンをブロックする
- はスレッド上で、スレッド2で、このデータのための1
- 待ちを実行している非同期コールバックからのデータを受信し、それを消費します。 KotlinのコルーチンがたCountDownLatchを取り除くために私を助けることができるはず、私が理解から
private var latch = CountDownLatch(1) private var data: Any? = null // Async callback from non-blocking I/O fun onReceive(data: Any) { currentData = data latch.countDown() } // Wait and consume data fun getData(): Any? { latch.await() latch = CountDownLatch(1) return currentData } fun processData() { launch(CommonPool) { while (true) { val data = getData() // Consume data } } }
:
私の現在のコードは、(簡潔にするために簡略化され)、このようになります。 を読んだ後、私が思い付くことができるすべては、このようなものです:
// Wait and consume data
fun getData() = async(CommonPool) {
latch.await()
latch = CountDownLatch(1)
currentData
}
fun processData() {
launch(CommonPool) {
while (true) {
runBlocking {
val data = getData().await()
// Consume data
}
}
}
}
私も同様の結果が得られ、Pipelinesてみました。私は明らかにこれらの機能の使い方を理解していません。
質問のコードから、あなたの目標は何か分かりにくいです。どのような外部関数が何を返すかを明確にしてください。 – voddan
このシナリオでは、どのAPI呼び出しが約束を返し、どのような種類のAPI呼び出しを返すかを知る必要があります。この情報を質問に追加してください – voddan
@voddan私の目標は、ノンブロッキングソースからのデータが準備と処理を待つことです(実際のソースはユーザー入力ですが、ソース)。非ブロックソースは、データの処理準備が整うと 'onReceive()'を呼び出します。データ型は無関係です。私の実際のコードでは、データ型はカスタムクラスです。 – m0skit0