gpt4 book ai didi

kotlin - 对 Kotlin 与协程相关的挂起函数感到困惑

转载 作者:行者123 更新时间:2023-12-02 08:24:54 24 4
gpt4 key购买 nike

如果我理解正确的话,挂起函数是您可以在协程内执行的函数,挂起函数的作用是挂起协程,以便另一个协程可以开始工作。现在,这是否意味着当协程挂起时,挂起函数仍在工作?这让我感到困惑,因为我看到很多文本都说它不仅暂停协程,还暂停暂停函数。但是,如果它也暂停了挂起功能,那么如果您想要完成的工作暂停了,那还有什么意义呢?

假设我有一个挂起函数,需要 30 秒才能完成一些数学计算。然后我有另一个协程,它打印了一些简单的文本,例如“Hello,World”。如果第一个协程挂起并转到第二个协程打印问候语,同时还会进行数学计算吗?

最佳答案

Now, does this mean that while the coroutine is suspended that the suspend function is still doing work?

不,这意味着其他函数可以在挂起时执行工作。

This is what confuses me because I've seen many texts say that it pauses not only the coroutine but also the suspend function.

这是正确的。

But if it pauses the suspend function as well then whats the point if the work you wanted to be done is paused?

主要用例是将工作委派给外部资源,尤其是网络层。当您的函数正在等待来自网络的数据时,它没有其他事情可做。与此同时,其他协程可能会继续在同一线程上执行。

Suppose I had a suspend function that takes 30 seconds to finish doing some mathematical calculation.

该函数尽管被声明为可挂起,但实际上可能不会自行挂起。它会一直占用调用线程。

And then I had another coroutine that said printed some simple text like "Hello, World".

如果您使用的是单线程调度程序,则该协程必须等待轮到第一个协程显式挂起自身,这在您提到的 CPU 密集型函数中可能不会发生。

If the first coroutine suspends and goes to the second coroutine to print the greeting, would mathematical calculation still be happening at the same time?

不,挂起的协程不执行任何工作。

例如,第一个协程可以在其计算循环中调用yield(),从而允许 Kotlin 挂起它并在同一线程上运行一些其他协程。暂停期间不会取得任何进展。

你可以这样看:假设有一个线程运行所有协程。它们运行的​​方式称为“合作并发”。协程必须显式挂起自身以允许其他协程运行。这与在单个 CPU 核心上同时运行的多个线程非常相似,只不过操作系统可以做另一件“神奇”的事情:它可以随时挂起线程,而无需该线程的许可。这就是为什么这种类型被称为抢占式并发。

关于kotlin - 对 Kotlin 与协程相关的挂起函数感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59586857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com