执行io-bound函数(例如,从后端请求数据(在coroutine中使我有优势暂停其执行,直到请求结果可用,对吗?但是,可以通过CPU结合的函数(例如,解析庞大的文本文件("等待"任何内容,它只是做很多工作。因此,在Coroutine内部执行它是否没有给我暂停执行的优势吗?当涉及到CPU结合函数时,唯一的(有价值的(优势为我提供了能够选择执行该功能时会阻止的线程(或线程池(,我是否正确?
暂停功能不会自动使函数不阻止线程,就像在以下情况下一样,因为它仍然会阻止调用线程(与用于启动Coroutine的范围相关联的调度程序(
suspend fun findBigPrime(): BigInteger =
BigInteger.probablePrime(4096, Random())
悬挂函数可以通过使用以下方式使用context,将功能变成非阻滞线程函数,
suspend fun findBigPrime(): BigInteger =
withContext(Dispatchers.Default) {
BigInteger.probablePrime(4096, Random())
}
这会导致从主/呼叫者线程启动的Coroutine被阻止,但线程本身不会阻止。
https://medium.com/@elizarov/blocking-threads-suspending-coroutines-d33e11bf4761
那么,在coroutine内执行它不是给我暂停执行的优势吗?
我不确定我理解您的意思,但是呼叫暂停功能无论如何都会暂停调用Coroutine,无论您选择什么调度员,这并不取决于我所知道的功能中的内容。<<<<<<<<<</p>
但是,请注意,从Coroutine内部调用A blocking 函数将使此coroutine阻止执行该线程的线程,这里没有魔法。这就是为什么应在Coroutines内避免进行阻止操作的原因。
当涉及到CPU结合函数时,唯一的(有价值的(优势为我提供了,可以选择执行该功能时会阻止的线程(或线程池(,我是否正确?
使用Dispachers.IO
或Dispatchers.Default
仅具有选择其他线程池的效果,是的。
在IO
的情况下,池将尽可能多地产生螺纹,因为它们都可以"在I/O上被阻止"。
在Default
的情况下,只会创建与核心数量成比例的许多线程,因为CPU结合的任务与核心相比,可以创建更多的线程(如果所有核心都忙(没有意义(那么上下文切换只能降低整体性能(。