如果我理解正确的话,挂起函数就是你可以在一个协同线内执行的东西,而挂起函数所做的就是它们挂起协同线,以便另一个协同线可以开始工作。现在,这是否意味着当协同线被暂停时,挂起函数仍然在工作?这就是让我困惑的原因,因为我看到很多短信说它不仅暂停了协同作用,而且还暂停了暂停功能。但是,如果它也暂停了挂起功能,那么如果您想要完成的工作暂停了,那么有什么意义呢?
假设我有一个挂起函数,需要30秒才能完成一些数学计算。然后我又有了另一条协同线,上面写着一些简单的文字,比如“你好,世界”。如果第一个协同线暂停并进入第二个协同线打印问候语,那么数学计算是否仍在同时进行?
发布于 2020-01-04 13:46:51
现在,这是否意味着当协同线被暂停时,挂起函数仍然在工作?
不,这意味着其他函数可以在挂起时工作。
,这就是让我困惑的地方,因为我看到很多文本都说它不仅暂停了协同作用,而且还暂停了挂起功能。
这是正确的。
,但是如果它也暂停了挂起函数,那么如果您想要完成的工作暂停了,那么有什么意义呢?
主要用例是将工作委托给外部资源,特别是网络层。当您的函数正在等待来自网络的数据时,它没有其他的事情可做。同时,其他协同机制可能继续在同一个线程上执行。
假设我有一个挂起函数,需要30秒才能完成一些数学计算。
尽管该函数被宣布为可暂停,但它可能实际上不会暂停自身。它会一直占用调用线程。
和我还有另外一条协作线,上面写着打印一些简单的文本,比如“你好,世界”。
如果您使用的是单线程调度程序,那么该协同器必须等到第一个协同器显式挂起为止,这可能不会发生在您提到的CPU密集型函数中。
如果第一个协同线暂停并进入第二个协同线打印问候语,那么数学计算是否仍在同时进行?
不,悬吊的补给线不起任何作用。
例如,第一个协同线可能在其计算循环中调用yield(),从而允许Kotlin挂起它并在同一个线程上运行其他协同值。暂停的时候不会有任何进展。
您可以看到这样的情况:假设有一个线程运行所有协同机制。它们的运行方式称为协作并发。协同线必须显式地挂起自己,以允许其他人运行。这非常类似于在单个CPU核心上并发运行的几个线程,除了操作系统可以做一件“神奇”的事情:它可以在任何时候挂起线程,无需该线程的许可。这就是为什么这种被称为先发制人的并发。
https://stackoverflow.com/questions/59586857
复制相似问题