当前位置: 首页 > 知识库问答 >
问题:

关于Kotlin与相关函数的悬浮函数的困惑

沈单弓
2023-03-14

共有1个答案

傅乐湛
2023-03-14

现在,这是否意味着当coroutine挂起时,suspend函数仍在工作?

不,但可能会让您感到困惑的是WithContext原语,它使您的函数在当前coroutine挂起时在另一个线程上运行。这样,您的函数在后台线程上运行,而其他关联项同时在主线程上运行。

这让我感到困惑,因为我看到很多文本说它不仅暂停coroutine,还暂停了suspend函数。

如上所述,如果使用WithContext,计算和打印将同时运行,但这只是因为涉及到另一个线程。

第一个coroutine还可以在其计算循环中调用yield(),从而允许Kotlin挂起它并在同一线程上运行其他一些coroutine。在这种情况下,它不会在暂停时取得任何进展。

您可以如下所示:假设有一个线程运行所有相关项。它们的运行方式称为协作并发。coroutine必须显式挂起它自己,以允许其他coroutine运行。这非常类似于在单个CPU核上并发运行的几个线程,只不过OS可以做一件更“神奇”的事情:它可以在任何时候挂起线程,而无需该线程的许可。这就是为什么这种类型被称为抢占式并发。

 类似资料:
  • 调度点的相关关键函数 虽然进程各种状态变化的原因和导致的调度处理各异,但其实仔细观察各个流程的共性部分,会发现其中只涉及了三个关键调度相关函数:wakup_proc、shedule、run_timer_list。如果我们能够让这三个调度相关函数的实现与具体调度算法无关,那么就可以认为ucore实现了一个与调度算法无关的调度框架。 wakeup_proc函数其实完成了把一个就绪进程放入到就绪进程队列

  • bind_.bind(function, object, *arguments) 绑定函数 function 到对象 object 上, 也就是无论何时调用函数, 函数里的 this 都指向这个 object.任意可选参数 arguments 可以传递给函数 function , 可以填充函数所需要的参数,这也被称为 partial application。对于没有结合上下文的partial ap

  • 另外一个我们需要的操作则是乘法。不像加法那样,乘法在极坐标系中容易,在笛卡尔坐标系中麻烦些(是相对有点麻烦而已)。 在极坐标系,我们只需将模相乘,角度相加。像往常那样,我们使用访问函数来实现而不必关心对象的表现形式。 Complex mult (Complex& a, Complex& b) { double mag = a.getMag() * b.getMag()

  • 对复数做加法是一个很常见的操作。复数在笛卡尔坐标系上的加法是很简单的,只需对实部虚部分别相加即可。如果在极坐标系中进行加法,最简单的方式则是将复数转换到笛卡尔坐标系中再进行相加。 于是,使用访问函数就可以很容易的做到: Complex add (Complex& a, Complex& b) { double real = a.getReal() + b.getReal();

  • 问题内容: 在中,我使用或计算成对互相关函数,以便找出哪个偏移使我获得了最大值。从它的外观来看,给了我一个规范化的值序列。Python的scipy中是否有类似的东西,还是应该使用该模块?目前,我正在执行以下操作: 问题答案: 要使一维数组互相关,请使用numpy.correlate。 对于2d数组,请使用scipy.signal.correlate2d。 还有scipy.stsci.convolv

  • 本文向大家介绍C#关于Task.Yeild()函数的讨论,包括了C#关于Task.Yeild()函数的讨论的使用技巧和注意事项,需要的朋友参考一下       在与同事讨论async/await内部实现的时候,突然想到Task.Yeild()这个函数,为什么呢,了解一点C#async/await内部机制的都知道,在await一个异步任务(函数)的时候,它会先判断该Task是否已经完成,如果已经完成