Send 和 Offer 之间的 Kotlin Channels 使用差异

Can*_*ato 5 channel kotlin kotlin-coroutines kotlin-coroutine-channel

通道有两个功能允许我们向其中发送事件。 Sendoffer

我想更好地理解两者之间的区别。

我有一些说法想核实一下是否属实。

  • Send是一个挂起函数。什么会让我的代码(而不是线程)等待它完成。因此,在内部事件send完成/取消后,它会继续运行。或者它只会挂起,直到我可以对事件进行排队/接收它?
  • 这意味着,如果我send从一个通道使用到另一个通道,第一个通道将被阻塞,直到第二个通道可以接收/排队?
  • 如果我有一个Rendezvous Channel 并且它已经在运行某些东西(例如挂起时,等待 API),并且我有offer一个新的事件。这会引发offer异常吗?导致频道收不到?

如果您知道任何其他主要区别,我会很高兴知道。

提前致谢

ale*_*ria 8

send当发送到的通道已满时,暂停调用它的协程。

send一个通道发送另一通道。当您调用时,您将向通道send发送一个元素。然后,通道期望从不同的协程调用另一个代码块。receive

在 a 中,RendezvousChannel容量为0。这意味着send始终挂起等待receive另一个协程的调用。如果您先调用send了 aRendezvousChannel然后使用offer,offer将不会抛出异常(仅当通道关闭时才会抛出异常),而是如果在初始 后没有调用false平衡,它将返回。这是因为如果元素不违反其容量限制,则会尝试立即将元素添加到通道中。receiveRendezvousChannelsendoffer

  • 正如您从[文档](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/is-filled-for-send.html 中看到的那样):“如果此通道通过调用 close 关闭,则返回 true”。已满的通道不会关闭发送。 (2认同)