你怎么知道什么时候需要 yield()?

How do you know when you need to yield()?

以 Kotlin 通道为例

for(msg in channel){
    // to stuff
    yield() // maybe?
}

你怎么知道是否需要 yield?我假设 Channels 的构建方式是让出在迭代器的幕后自动发生,但我不确定。一般来说,在使用 Kotlin 协程库的其余部分可能会自动为您完成时,您怎么知道您需要手动 yield?

在大多数情况下,您根本不需要使用 yield() 或关心它。协程可以在我们到达挂起点时自动切换,这通常会经常发生。

yield() 仅当我们的代码不会长时间挂起时才需要。这通常意味着我们正在执行密集的 CPU 计算。在你的例子中,从频道接收是暂停操作,所以你不需要 yield() 这里。

如果你想在一段代码中有none的情况下人为添加一个挂点,只需要调用yield即可。暂停点是对 suspend 函数的调用。

如果您不知道哪些函数是 suspend,您可以在 IntelliJ IDEA 中快速识别它们,因为每个挂起函数调用都标有一个图标:

因此在您的情况下,您会在通道上的迭代中看到它:

如果您有专门使用常规函数的循环或扩展代码片段,或者更一般地说,如果您想确保其他协程有机会 [=31],那么您只需要手动添加 yield =] 在特定时间点(例如在测试中)。这种情况不应该经常发生。