- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在阅读 Coroutine Basics试图理解和学习它。
这里有一段代码:
fun main() = runBlocking { // this: CoroutineScope
launch {
delay(200L)
println("Task from runBlocking")
}
coroutineScope { // Creates a new coroutine scope
launch {
delay(900L)
println("Task from nested launch")
}
delay(100L)
println("Task from coroutine scope") // This line will be printed before nested launch
}
println("Coroutine scope is over") // This line is not printed until nested launch completes
}
输出如下:
Task from coroutine scope
Task from runBlocking
Task from nested launch
Coroutine scope is over
我的问题是为什么这行:
println("Coroutine scope is over") // This line is not printed until nested launch completes
总是最后调用?
不应该调用它,因为:
coroutineScope { // Creates a new coroutine scope
....
}
被暂停了?
那里还有一个注释:
The main difference between runBlocking and coroutineScope is that the latter does not block the current thread while waiting for all children to complete.
我不明白 coroutineScope 和 runBlocking 在这里有何不同? coroutineScope 看起来像它的阻塞,因为它只在完成后才到达最后一行。
有人能告诉我吗?
提前致谢。
最佳答案
I don't understand how coroutineScope and runBlocking are different here? coroutineScope looks like its blocking since it only gets to the last line when it is done.
有两个独立的世界:可暂停世界(在协程内)和不可暂停世界。一旦你进入 runBlocking
的主体,你就进入了可暂停的世界,suspend fun
的行为就像阻塞代码一样,直到你无法进入下一行suspend fun
返回。 coroutineScope
是一个 suspend fun
,仅当其中的所有协程完成时才返回。因此最后一行必须打印在最后。
我从似乎受到读者点击的评论中复制了上述解释。这是原始答案:
从block中的代码来看,你的理解是正确的。 runBlocking
和 coroutineScope
的区别发生在较低的层次:当协程被阻塞时线程发生了什么?
runBlocking
不是 suspend fun
。调用它的线程会一直留在其中,直到协程完成。
coroutineScope
是一个暂停乐趣
。如果你的协程挂起,coroutineScope
函数也会被挂起。这允许顶层函数,一个创建协程的非挂起函数,继续在同一个线程上执行。线程已经“转义”了 coroutineScope
block 并准备好做一些其他工作。
在您的具体示例中:当您的 coroutineScope
暂停时,控制权返回到 runBlocking
内的实现代码。这段代码是一个事件循环,它驱动你在其中启动的所有协程。在您的情况下,将有一些协程计划在延迟后运行。时间到了会恢复相应的协程,运行一小会儿,挂起,然后控制又回到runBlocking
里面。
虽然上面描述了概念上的相似之处,但它也应该向您展示 runBlocking
是一个与 coroutineScope
完全不同的工具。
runBlocking
是一个低级结构,仅用于框架代码或像您这样的自包含示例。它将现有线程转换为事件循环,并使用 Dispatcher
创建其协程,将恢复的协程发布到事件循环的队列中。
coroutineScope
是一个面向用户的构造,用于描绘在其中被并行分解的任务的边界。您可以使用它方便地等待其中发生的所有 async
工作,获得最终结果,并在一个中心位置处理所有故障。
关于kotlin - 协程 : runBlocking vs coroutineScope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53535977/
任何人都可以明确功能之间的关系CoroutineScope()和 coroutineScope() ? 当我试图检查源代码时,我发现它们都是CoroutineScope.kt的函数。 .此外,coro
2019年5月7日,androidx.Life Cycle:*:2.2.0-alpha01发布,宣布:。在文档中提到,我可以获得LifecycleScope:。但是我好像一个也找不到。我目前的依赖关系
val scope = CoroutineScope( Job() + Dispatchers.Main ) scope.launch { beforeExecute()
我完全理解 suspendCoroutine 与 suspendCancellableCoroutine 在我的示例中的工作方式。但我想知道为什么 println("I finished") (第 1
我想知道coroutineScope工作完成后会自动取消。假设我创建了一个 coroutineScope在自定义类中 而不是 ViewModel类(class)或 Fragment / Activit
看完CoroutineScope的介绍和javadoc我仍然有点困惑 CoroutineScope 背后的想法是什么。 文档的第一句话“定义新协程的范围”。我不清楚:为什么我的协程需要范围? 另外,为
我需要下载多张图片,并在所有下载完成后(在主线程之外),在 Activity 中执行其他操作。 我目前使用Glide下载如下: ImageDownloader.kt class ImageDownlo
我有一个 kotlin 多平台项目,并在公共(public)模块中实现了一个简单的存储库类来进行 API 调用。我将协程范围作为参数传入,以便能够使用 viewModelScope并将其默认为通用代码
我正在重构一些目前在 GlobalScope 上启动协同程序的 Kotlin 代码到结构化的基于并发的方法。我需要在 JVM 退出之前加入在我的代码中启动的所有作业。我的类可以分解为以下界面: int
我正在尝试使用 CoroutineScope 的扩展功能启动一些异步工作。 我不知道如何从我的主类调用这个方法,见下文: class MyService { fun CoroutineScope
我正在使用协程编写一个应用程序(下面的代码已大大简化)。最近看了Coroutines in Practice说话有点糊涂了。原来我不知道什么时候使用 CoroutineScope 的扩展函数,什么时候
在 Kotlin Coroutines 中,想为当前线程创建一个引用并在以后使用它。 fun myFuncion(){ //save current Thread CoroutineScope
我正在试验协程,但不确定是否将 coroutineScope 传递给普通的 Kotlin 用例。这种方法会造成内存泄漏吗? 假设我们在 VM 中初始化我们的 UseCase 并尝试传递 viewMod
关于这个话题我有两个问题。我将在 android 中将它们与用例类一起使用,并尝试实现类似于此 https://www.youtube.com/watch?v=Sy6ZdgqrQp0 的架构但我需要一
从 CoroutineScope 检测取消 我正在尝试从 CoroutineScope 检测取消,但是当我尝试在 CoroutineScope 中调用 cancel 方法时,isCancelled 属
有人可以解释一下这两者之间到底有什么区别吗? 你什么时候用一个? 提前致谢。 最佳答案 解释差异的最好方法是解释coroutineScope的机制。 .考虑这个代码: suspend fun main
我习惯使用 AsyncTask并且由于它的简单性而很好地理解它。但是Coroutines让我很困惑。您能否以简单的方式向我解释以下各项的区别和目的是什么? GlobalScope.launch(Dis
假设 CoroutineScope 是由一些生命周期感知组件实现的,比如 Presenter。什么时候使用 GlobalScope.produce 与 CoroutineScope.produce 比
我正在阅读 Coroutine Basics试图理解和学习它。 这里有一段代码: fun main() = runBlocking { // this: CoroutineScope laun
我有一个重试策略,它接受一个 lambda,启动一个 CoroutineScope ,增加重试计数器,检查是否达到最大重试次数,计算 waitTime根据重试次数,延迟这次的作用域,最后调用 lamb
我是一名优秀的程序员,十分优秀!