2017-04-02 30 views
1

ノンブロッキングI/Oを処理するためにコトリンコルーチンを使用しようとしています。次のようなシナリオは次のとおりです。Kotlin:ノンブロッキングI/Oでコルーチンをブロックする

  1. はスレッド上で、スレッド2で、このデータのための1
  2. 待ちを実行している非同期コールバックからのデータを受信し、それを消費します。 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てみました。私は明らかにこれらの機能の使い方を理解していません。

+0

質問のコードから、あなたの目標は何か分かりにくいです。どのような外部関数が何を返すかを明確にしてください。 – voddan

+0

このシナリオでは、どのAPI呼び出しが約束を返し、どのような種類のAPI呼び出しを返すかを知る必要があります。この情報を質問に追加してください – voddan

+0

@voddan私の目標は、ノンブロッキングソースからのデータが準備と処理を待つことです(実際のソースはユーザー入力ですが、ソース)。非ブロックソースは、データの処理準備が整うと 'onReceive()'を呼び出します。データ型は無関係です。私の実際のコードでは、データ型はカスタムクラスです。 – m0skit0

答えて

1

onReceive()で受信したデータを並行して処理できるかどうかはあなたが言っていません。これが主な質問です。はいの場合は、onReceive()で行うことができます。これが許可されていない場合は、onReceive()への各呼び出しはコルーチンなしでCommonPoolのタスクを開始します。シーケンシャルに処理する必要がある場合は、最も簡単な方法は、ループ内のループを開始することです。

fun onReceive(data: Any) { 
    queue.put(data); 
} 

.... 

// loop in a thread 
while(true) { 
    data = queue.take(); 
    processData(data); 
} 

この場合も、コルーチンは必要ありません。

一般に、コルーチンは、非同期プログラムを同期しているかのように表すための構文的な砂糖です。私はあなたのプログラムがコルーチンを使用するケースとは考えていません。

関連する問題