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
.
这比每次发送都启动一个新作业便宜很多,而且通道会保留顺序
我有一个 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
.
这比每次发送都启动一个新作业便宜很多,而且通道会保留顺序