首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin Coroutines:使用NonCancellable和独立的新工作有什么不同

Kotlin Coroutines是一种用于异步编程的框架,它可以简化并发编程的复杂性。在使用Kotlin Coroutines时,可以使用NonCancellable和独立的新工作来实现不同的效果。

  1. NonCancellable(不可取消的):NonCancellable是一个上下文元素,用于指定一个协程不可被取消。当使用NonCancellable时,即使外部协程被取消,被标记为NonCancellable的协程仍然会继续执行。这对于一些关键任务或需要确保执行完成的操作非常有用。
  2. 独立的新工作:独立的新工作是指在协程中启动一个新的协程,该新协程与父协程无关,它们可以并行执行而不会相互影响。独立的新工作可以通过使用launch函数来实现。与NonCancellable不同,独立的新工作不受父协程的取消影响,它们会继续执行直到完成。

使用NonCancellable和独立的新工作的不同之处在于它们的取消行为和执行方式:

  • NonCancellable用于确保某些关键任务的执行不会被取消,即使外部协程被取消。这对于需要保证执行完成的操作非常有用,例如数据库事务的提交或网络请求的发送。通过使用withContext(NonCancellable)函数将代码块包装起来,可以将其标记为不可取消的。
  • 独立的新工作用于在协程中启动一个与父协程无关的新协程,它们可以并行执行而不会相互影响。独立的新工作可以通过使用launch函数来实现。与NonCancellable不同,独立的新工作不受父协程的取消影响,它们会继续执行直到完成。这对于需要并行执行的任务非常有用,例如同时进行多个网络请求或并行处理大量数据。

总结:

  • NonCancellable用于确保关键任务的执行不会被取消,适用于需要保证执行完成的操作。
  • 独立的新工作用于在协程中启动一个与父协程无关的新协程,适用于需要并行执行的任务。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数计算(云原生Serverless计算服务):https://cloud.tencent.com/product/scf
  • 腾讯云数据库(云原生数据库服务):https://cloud.tencent.com/product/cdb
  • 腾讯云容器服务(云原生容器化部署与管理服务):https://cloud.tencent.com/product/tke
  • 腾讯云CDN(内容分发网络服务):https://cloud.tencent.com/product/cdn
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

《Kotin 极简教程》第9章 轻量级线程:协程(2)《Kotlin极简教程》正式上架:

它是一个完全无锁实现。 9.10.2 关闭通道迭代遍历元素 与队列不同, 通道可以关闭, 以指示没有更多元素。在接收端, 可以使用 for 循环从通道接收元素。...协程通常是由编译器来实现机制。线程看起来也在语言层次,但是内在原理却是操作系统先有这个东西,然后通过一定API暴露给用户使用,两者在这里不同。 协程就是用户空间下线程。...另外,使用协程,我们不再需要像异步编程时写那么一堆callback函数,代码结构不再支离破碎,整个代码逻辑上看上去同步代码没什么区别,简单,易理解,优雅。...关于协程工作原理更多细节可以在这个设计文档中找到:https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md...9.15.2 标准 API 协程三个主要组成部分: 语言支持(即如上所述挂起功能), Kotlin 标准库中底层核心 API, 可以直接在用户代码中使用高级 API。

1.2K20

《Kotin 极简教程》第9章 轻量级线程:协程(1)

其中比较典型Scheme、Lua、Python、Perl、Go等以first-class方式提供对协程支持。 同样地,Kotlin也支持协程。...,启动一个协程后台任务,并返回一个Job类型对象作为当前协程引用。...Thread.sleep(5000L) } 9.2 桥接 阻塞非阻塞 上面的例子中,我们给出使用非阻塞delay函数,同时有使用了阻塞Thread.sleep函数,这样代码写在一起可读性不是那么地好...让我们来使用Kotlin协程代码来实现上面的 阻塞+非阻塞 例子(不用Thread)。...} 9.6.4 协程执行不可取消代码块 如果我们想要上面的例子中finally{...}完整执行,不被取消函数操作所影响,我们可以使用 run 函数 NonCancellable 上下文将相应代码包装在

1.1K10

tcpudp区别使用场景_TCP跟UDP什么不同

大家好,又见面了,我是你们朋友全栈君。 TCPUDP都是传输层协议 TCP TCP 是一种面向连接传输层协议,能够对自己提供连接实施控制。适用于要求可靠传输应用,例如文件传输。...在实际网络中,基于TCP连接两端,可以同时进行TCP报文段发送接收(即全双工通信) TCP可靠传输,UDP不可靠传输 UDP 网络层向传输层提供是无连接不可靠传输服务,当传输层使用UDP...,其他什么也不做。...,也就是不可靠,不使用流量控制拥塞控制 可靠传输,使用流量控制拥塞控制 首部对比 仅8字节 最小20字节,最大60字节 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。...如发现本站涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

76920

再谈协程之CoroutineContext我能玩一年

Kotlin Coroutines核心是CoroutineContext接口。...为了理解为什么必须重新定义一个接口,而不是简单地使用一个标准Map,我们可以参考下面这样一个类似的等效申明。...❝Coroutine上下文一个元素本身就是一个只包含自身上下文。 ❞ 了这个「+」运算符,就可以被用来轻松地将元素以及元素与元素之间结合成一个上下文。...首先,plus之后,不出意外的话,会返回CombinedContext,只其中会包含plus两边对象,这里两种可能,一种是A + B时候,B中有A相同Key,那么A中对应Key会被删掉,使用...在以前coroutines版本中,async中代码将在Dispatchers.Default提供工作线程上运行,但现在它将在UI线程上运行,这可能导致应用程序阻塞甚至崩溃。

62910

Kotlin协程开篇

Kotlin协程》均基于Kotlinx-coroutines 1.3.70 新开个坑,专门讲kotlin协程。聊协程之前先说一下具体聊是协程什么内容。 · 协程是什么? · 什么时候用协程?...· 协程核心是什么? · kotlin协程其他语言协程什么异同? kotlin协程出现其实比kotlin语言还晚一点。在当前这个版本,协程甚至都还处于一个不稳定迭代版本中。...协程到目前为止都还没进入kotlin标准库,它是一个独立依赖库,叫 Kotlinx。对于想在开发中使用协程的人来说,需要在依赖里加入kotlinx-core依赖。...在Kotlin使用协程非常方便, import kotlinx.coroutines.* fun main() { GlobalScope.launch { // 在后台启动一个协程并继续...kotlin协程还在发展 如果去看kotlin协程源码的话会发现里面有很多 exeprimental api实现逻辑。

87820

如何优雅取消协程 ?

⚠️ 协程作用域一旦被取消,就不能在其中创建协程了。 如果你在使用 androidx KTX 类库的话,大多数情况下你不需要创建自己作用域,因此你也不需要负责取消它们。...例如,当 ViewModel 进入 cleared 状态时,会自动取消其中启动所有协程。 为什么协程中工作没有停止? 当我们调用 cancel 时,并不意味着协程中工作会立即停止。...} 让我们逐步来看发生了什么。当调用 launch 时,创建了一个协程,并处于 active 状态。...yield 应该在定时检查中最先被调用,就像前面提到 ensureActive 一样。 Job.join() Deferred.await() 取消 获取协程返回值两种方法。...处理协程取消带来副作用 现在假设我们需要在协程取消时做一些特定任务:关闭正在使用资源,打印取消日志,或者其他一些你想执行清理类代码,以下几种方法可以实现。 检查 !

1.4K30

kotlin--协程启动取消

一、协程启动 1.launch与async构建器都用来启动协程 launch:我们之前已经使用过了GlobalScopelaunch来启动协程,它返回一个Job async:返回一个Deferred...,它也是一个Job,但是可以使用await函数获得运行结果 除了之前结构化并发中介绍几种指定CoroutineScopeAPI外,我们还可以使用runBlocking函数来指定CoroutineScope...,他会使用主线程来转换成协程 launchasync内如果有子协程,那么该协程会等待子协程执行结束 fun `test coroutine build`() = runBlocking {...1.runBlocking与coroutineScope runBlocking是常规函数,它会阻塞主线程,而coroutineScope是挂起函数,它们都会等待其协程体子协助执行结束,作用域构建器使用是父协程上下文...二、协程取消 1.协程取消 1.取消作用域会取消它子协程,CoroutineScope是创建一个全新协程上下文,coroutineScope作用域是不同,作用域构建器使用是父协程上下文 fun

95630

【译】LiveData with Coroutines and Flow

为此,我们建议采用分层架构,这样我们就可以编写独立于UI代码,而不用过多考虑生命周期。例如,我们可以添加一个持有业务逻辑领域层(你应用程序实际做什么一个数据层。...通常与ViewModels工作方式有关。 这是一个在Android社区相当成熟惯例,但你会发现有一些文章不同意见。...这就是为什么我们在《应用程序架构指南》中推荐这种方法。 Scopes 由于ActivitiesFragments比ViewModels相等或更短寿命,我们可以开始讨论操作范围了。...一个非常方便解决方案是Kotlin Coroutines。 我们喜欢在Android中使用Coroutines很多原因。其中一些是。 很容易脱离主线程。...如果你想了解coroutines介绍,可以看看Android介绍Kotlin官方文档。

1.4K10

今天Kotlin 1.3正式发布:支持协程多平台组件Kotlin 开发者社区

,此外,Kotlin 跨平台功能将为 Android iOS 应用程序等组件之间共享业务逻辑,服务器也可以与 Web 移动客户端共享逻辑,而且多平台库让日常开发变得便捷。...Kotlin 生态现状 今年以来,Kotlin 使用了很大增长,自今年 1 月份以来,约有 150 万开发者使用了 Kolin 编程,是去年同期两倍,来自 Stack Overflow 一项问卷调查显示...详解 Kotlin 1.3 新功能 Coroutines 已经稳定 CoroutinesKotlin 1.1 引入异步 API,它是一个强大工具,之前该特性一直处于试验阶段,而在最新 v1.3...中,Coroutines 语法标准库 API 都已稳定,你可以开始使用它了。...详情请阅读:https://kotl.in/coroutines Kotlin / Native Beta Kotlin / Native 使用 LLVM 将 Kotlin 源代码编译为独立二进制文件

1.3K20

关于 Kotlin Coroutines, 你可能会犯 7 个错误

在我看来,Kotlin Coroutines(协程) 大大简化了同步异步代码。...但是,我发现了许多开发者在使用协程时会犯一些通用性错误。 1. 在使用协程时实例化一个 Job 实例 有时候你会需要一个 job 来对协程进行一些操作,例如,稍后取消。...另外由于协程构建器 launch{} async{} 都需要 job 作为入参,你可能会想到创建一个 job 实例作为参数来使用。...所以你创建协程父 job 并不是协程作用域 job,而是新创建 job 对象。 因此,协程 job 和协程作用域 job 此时并没有什么关联。...尝试使用 try/catch 来处理协程异常 协程异常处理很复杂,我花了相当多时间才完全理解,并通过 博客[8] 讲座[9] 向其他开发者进行了解释。

91120

干货 | 携程机票 App KMM 跨端生产实践

JetBrains 提出了不同于 RN 与 Flutter 跨端解决方案,即使用不同编译器编译同一份代码生成各端不同产物来达到跨平台目的,这就是 Kotlin Multiplatform。...上面关于 MMKV 封装是一种常规且较为简单封装,在我们实际工作内容中,对网络框架封装与改造值得一提。 携程自研网络框架并非标准 HTTP 协议,底层大量定制协议等内容。...更让人头疼是,数据在 Store 内流转时每经过一个组件就会变一个名字,这丛概念上讲确实没有什么问题,因为数据在不同组件间流转时从概念上来说会有区别,但在 MVIKotlin 设计中每种概念都由一个...;在 kotlinx 库方面,除了上述 kotlinx.coroutines 与 kotlinx.serialization,官方之前又启动了 kotlinx.datetime 项目,用于在全平台...在 Kotlin 生态环境发展中当然不止 JetBrains 官方功劳。

3.3K10

Kotlin极简教程》第一章 Kotlin简介100% interoperable with Java™

这是kotlin官网首页重点强调: 100% interoperable with Java™ 这意味着什么呢?或者换个问法:我什么时候可以开始在我项目中引入kotlin呢?...从最初JythonJRuby,到Scala,Clojure都是在JVM上实现语言。为什么它们选择JVM? 跨平台 你语言编译器后端只需要输出 JVM 字节码就可以。...JVM 作为一个成熟高层运行环境,为 Guest 语言提供了很多运行时所需要服务,比如内存管理(业界领先垃圾回收等),很大程度上避免了额外独立开发。...社区庞大且成熟 JVM 多个独立实现,也有若干厂商会持续推进,资料完备,社区巨大。...程序设计语言中代码片段应该具备一个典型程序员所希望适度复杂性。程序员会去期望在每天工作使用语言。 中级程序员认可。所谓中级程序员是指那些普遍对博客、微博或者新语言不感兴趣的人。

75920

【翻译】深入 Kotlin 协程

我将会指导你使用协程相关基本示例,并观察背后到底发生了什么。 为什么像协程这种解决方案非常有必要? 在现代应用程序开发中,处理多线程任务是不可避免工作。...,这个代码仍然离我们刚开始写法相差甚远 —— 对于使用者来说还是那么一点复杂度。...那么让我们来看看具体怎样使用命令式风格写出类似的异步代码吧! 如何使用协程? 协程基于一种函数类型,叫做挂起函数。我们可以在函数名称前使用一种语言关键字 suspend 来标记。...work } var result = await doWork() 他们实现方式在关于异步代码应该写成什么看法上拥有一致基本理念,但是几个主要区别。...Coroutines Github.com Kotlin coroutines Kotlin 翻译

1.4K10

再谈协程之suspend到底挂起了啥

❞ 与回调不同是,coroutines提供了一种在线程之间切换处理异常简单方法。 但是,当我们把函数标记为suspend时,编译器实际上在幕后做了什么?...❝注意:从Kotlin 1.3开始,你还可以使用扩展函数resume(value: T)resumeWithException(exception: Throwable),它们是resumeWith调用特殊版本...切换不同Dispatchers 你可以在不同Dispatchers之间进行交换,在不同线程上执行计算。那么Kotlin如何知道在哪里恢复一个暂停计算?...❞ 这段代码是不完整,因为不同状态没有办法分享信息。编译器会在函数中使用相同Continuation对象来做这件事。这就是为什么Continuation泛型是Any?...现在你知道了编译器在编译时到底做了什么,你就可以更好地理解为什么一个suspend函数在它执行完所有工作之前不会返回。

89810
领券