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



我有一个类,它以非常快的速度侦听来自套接字的事件。我想将这些事件馈送到协同程序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

这比每次发送都启动一个新作业要便宜得多,并且通道将保留订单

最新更新