何时在 Kotlin 中使用 Unconfined

When to use Unconfined in Kotlin

我什么时候会选择使用Dispatchers.Unconfined?什么时候协程应该 运行 并不重要?所以你让协程选择更适合的线程池?

它与 Dispatchers.Default 有何不同?是不是当 运行 设置默认调度程序时,它总是在定义为默认线程池的特定线程池中?

The unconfined dispatcher is appropriate for coroutines which neither consume CPU time nor update any shared data (like UI) confined to a specific thread.

所以,我基本上会在非 IO、UI 或计算量大的情况下使用它 :D。 我认为这个用例的数量非常少,但我会想到一个不重的操作,但出于某种原因你仍然希望它在不同的线程上 运行。

Here's a link 实际工作原理。

Dispatchers.Default 确实不同,它主要用于繁重的 CPU 操作。 这是因为,它实际上将工作调度到一个线程数等于 CPU 核心数的线程池,并且至少为 2 个。这样开发人员可以充分利用 cpu 的全部容量在进行繁重的计算工作时。

So you let the coroutine to choose the thread pool as it better suits?

Unconfined 并非如此。理解它的最好方法是它是一个“无操作”调度程序,实际上根本不进行任何调度。无论您在何处调用 continuation.resume(),协程都会在该处恢复执行 — 在该调用内。当 resume() 调用 returns 时,意味着协程要么再次挂起,要么完成。

在正常编程中,您通常从回调中调用 continuation.resume() 并且运行回调的不是您的代码,因此您实际上无法控制协程恢复的线程。从不受您控制的库提供的回调中恢复时,不建议使用 Unconfined 调度程序。

Unconfined确实是一个特例工具,你可以在自己搭建协程执行环境,或者其他自定义场景中使用。基本上,只有在您积极寻找禁用正常调度机制的方法时才应该使用它。