你怎么知道什么时候需要 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
=] 在特定时间点(例如在测试中)。这种情况不应该经常发生。
以 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
=] 在特定时间点(例如在测试中)。这种情况不应该经常发生。