如何在主函数中恢复协程的执行?

Posted

技术标签:

【中文标题】如何在主函数中恢复协程的执行?【英文标题】:How execution of a coroutine resume in main function? 【发布时间】:2021-11-10 17:48:32 【问题描述】:

如果我们在主函数中使用协程,那么协程的执行如何在延迟后恢复。 就像在这张图片中,协程在 main 函数中,延迟 2 秒后代码恢复。所以我只想知道延迟后执行如何返回代码。我了解状态机以及协程在 android 中的工作原理。我在询问带有主要功能的 kotlin(不在 android 活动中)。

【问题讨论】:

无论平台如何,它们的工作方式都非常相似。上面的代码让你感到困惑的是什么? 在 android 中有 handler 和 looper,所以协程可以恢复任务,但在简单的控制台应用程序中没有 handler 和 looper,所以协程如何在延迟后恢复自己 Handler/looper 不是 Android 特有的技术 - 它只是一个线程 + 任务队列。在 Java 中,我们有执行器做类似的事情。 Kotlin 协程也是如此。 【参考方案1】:

如果您知道协程在 Android 中是如何工作的,我不确定是什么让您感到困惑。协程是非阻塞的,所以一旦延迟完成打印就会被执行。

全局范围用于启动在整个应用程序生命周期内运行且不会提前取消的***协程。

【讨论】:

协程如何在一个简单的控制台应用程序中恢复自身,因为没有处理程序和循环器。 在任何JVM应用程序中仍然存在线程blog.jamesdbloom.com/JVMInternals.html【参考方案2】:
GlobalScope.launch 
   delay(2000)
   print("World)

println("Hello")
Thread.sleep(3000)

无需过多介绍使用continuationstate-machine 执行协程suspend/resume 的细节

延迟后协程如何恢复执行

因为,你是blocking 主线程。 Thread.sleep(3000) 阻塞主线程 3 秒。如果您删除Thread.sleep,您可以看到差异。

在 android 中它不是必需的,因为 android UI 线程在 Handler/Looper 概念上运行,这与任何其他线程相同,唯一不同的是,它始终保持 Main/UI 线程处于活动状态并继续执行来自message-queue

【讨论】:

以上是关于如何在主函数中恢复协程的执行?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程协程的挂起和恢复 ② ( 协程挂起 和 线程阻塞 对比 )

Kotlin 协程协程的挂起和恢复 ① ( 协程的挂起和恢复概念 | 协程的 suspend 挂起函数 )

Kotlin 协程协程的挂起和恢复 ① ( 协程的挂起和恢复概念 | 协程的 suspend 挂起函数 )

跨多进程共享基于异步等待协程的复杂对象

我们如何在需要协程的地方调用普通函数?

线程代替epll实现协程的原理(yield调用next时的函数使用其他线程进行处理,不影响主线程继续运行,next异步处理线程处理后使用send传回处理结果)