Kotlin Coroutine - 保持通道发送事件同步

Kotlin Coroutine - Keeping Channel Send Event Synchronous

我有一个 class,它以非常快的速度侦听来自套接字的事件。我想将这些事件提供给协程 Channel。使用以下代码:

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

 ...

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

}

这是行不通的,因为有时事件来得太快,以至于由于 launch 产生了一个新的协程并且所有事情都是并行发生的,所以它们最终会乱序发布。如何确保 send 的顺序是同步的?

我试过 newSingleThreadContext 它确实有效,但它被认为是实验性的,并且有一条注释说它最终会被删除。我正在寻找更正确和更完整的解决方案。

不要并行启动 send,您应该使用容量为 Channel.UNLIMITED 的 Channel,并让 onMessageReceived 使用 offer而不是 send.

这比每次发送都启动一个新作业便宜很多,而且通道会保留顺序