Kotlin Coroutine - синхронизация отправки канала - PullRequest
1 голос
/ 23 октября 2019

У меня есть класс, который слушает события, поступающие из сокета, в очень быстром темпе. Я хотел бы скормить эти события в сопрограмму Channel. Используется следующий код:

class MyClass(channel: Channel<String>) : ... {

 ...

  override onMessageReceived(message: String) {
     MyScope.launch {
        channel.send(message)
     }
  }

}

Это не работает, так как иногда события приходят так быстро, что они заканчиваются тем, что публикуются не по порядку из-за того, что launch порождает новую сопрограмму и все происходит впараллельно. Как я могу убедиться, что порядок send является синхронным?

Я пробовал newSingleThreadContext, который сработал, однако он считается экспериментальным и имеет примечание о том, что он будет удален в конце концов. Я ищу более правильное и полное решение.

1 Ответ

1 голос
/ 23 октября 2019

Вместо параллельного запуска send необходимо использовать Channel с емкостью Channel.UNLIMITED и onMessageReceived использовать offer вместо send.

Это намного дешевле, чем запуск новой работы для каждого отправления, и канал сохранит заказ

...