【问题标题】:Kotlin Channels usage difference between Send and OfferSend 和 Offer 之间的 Kotlin Channels 使用差异
【发布时间】:2020-09-16 05:31:51
【问题描述】:

Channels 有两个函数可以让我们向它发送事件。 Sendoffer

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

我想检查一些陈述是否属实。

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

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

提前致谢

【问题讨论】:

    标签: kotlin channel kotlin-coroutines kotlin-coroutine-channel


    【解决方案1】:

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

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

    RendezvousChannel 中,容量为0。这意味着send 总是暂停等待来自另一个协程的receive 调用。如果您在RendezvousChannel 上调用了send,然后使用offeroffer 不会抛出异常(仅当通道关闭时才会抛出异常),而是如果没有平衡@,它将返回false在您的初始 send 之后,已在 RendezvousChannel 上调用了 987654337@。这是因为offer 会尝试在不违反其容量限制的情况下立即将元素添加到通道中。

    【讨论】:

    • 这让我感到困惑Throws an exception if the channel [is closed for send][isClosedForSend] (see [close] for details). 如果没有接收器并且已经有东西试图进入(发送暂停)将是频道closeForSend 吗?谢谢。抱歉再问,我想带上医生的话
    • docs 中可以看到:“如果此通道通过调用关闭而关闭,则返回true”。已满的通道不会关闭发送。
    猜你喜欢
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    相关资源
    最近更新 更多