挂起 Kotlin 协程中的 IO 绑定函数和 CPU 绑定函数



执行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.IODispatchers.Default仅具有选择其他线程池的效果,是的。

IO的情况下,池将尽可能多地产生螺纹,因为它们都可以"在I/O上被阻止"。

Default的情况下,只会创建与核心数量成比例的许多线程,因为CPU结合的任务与核心相比,可以创建更多的线程(如果所有核心都忙(没有意义(那么上下文切换只能降低整体性能(。

相关内容

  • 没有找到相关文章

最新更新