如果从协程调用非挂起函数会发生什么?

Gio*_*Gio 5 android kotlin kotlin-coroutines

Kotlin 中协程的关键概念之一是必须从协程或另一个挂起函数调用挂起函数

但是,挂起函数可以调用任何类型的函数,挂起或正常。
这样做的后果是什么?(这不是我的真实场景,只是出于理论原因想知道)

我想在那种情况下,创建协程的唯一目的是在调用它之前更改上下文(线程),因此它不会阻塞主线程。但是,协程的所有其他优势会丢失吗?(合作取消,结构化并发...)

Ale*_*hin 5

如果一个挂起函数调用另一个挂起函数,则协程将挂起,直到返回结果。

从挂起函数调用常规函数将阻塞线程。哪个线程?嗯,这取决于您使用的调度程序。IO能够产生数百个线程。但Default调度程序的线程数量与您的 CPU 数量相同。这意味着虽然这不会阻止其他协程,但会减少可用资源的数量。

含义:不要调用可能在此调度程序上长时间阻塞的非挂起函数,就像不阻塞线程一样UI

是的,如果您执行诸如繁忙循环之类的操作,而没有yield()任何其他挂起调用,则挂起函数可能会产生相同的结果。