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

【Kotlin 协程】协程启动 ⑥ ( 协程生命周期状态 | 新创建 New | 活跃 Active | 完成中 Completing | 已完成 Completed | 取消中 | 已取消 )

文章目录 一、协程标识 Job 实例对象 二、协程生命周期状态 三、协程生命周期状态改变 一、协程标识 Job 实例对象 ---- 通过 launch 或 async 协程构建器 函数 创建 协程 ,...获取当前是否处于 已完成状态 ; 取消中 Canceling 已取消 Cancelled : 通过调用 Job#isCancelled 获取当前是否处于 取消状态 ; 之前的博客 【Kotlin 协程...协程构建器 函数 创建 协程 时 状态为 新创建 New 状态 ; 协程 调度执行 后 会变成 活跃 Active 状态 ; 处于活跃状态的协程 有两个分支 , 分别是 协程完成 和 协程取消 :...协程完成分支 : 当有 子协程 完成时 , 会进入 完成中 Completing 状态 , 此时会等待其它子协程执行完毕 , 如果 所有的子协程都执行完毕 , 则进入 已完成 Completed 状态...; 协程取消分支 : 调用 Job#cancel() 函数 取消协程 , 会进入到 取消中 Canceling 状态 , 此时不会立刻取消 , 因为该协程中可能还有多个子协程 , 需要等待 所有子协程都取消后

64910

【Kotlin 协程】协程启动 ② ( 多协程控制 | launch 协程执行顺序控制 | Job#join() 函数 | async 协程执行顺序控制 | Deferred#await() 函数 )

; /** * 挂起协程,直到此作业完成。...此调用正常恢复(没有异常) * 当作业因任何原因完成且调用协程的[job]仍为[active][isActive]时。 * 这个函数也[启动][Job。...如果[Job]仍然处于_new_状态,则启动]相应的协程。 * * 注意,只有当所有子任务都完成时,作业才算完成。...* 如果调用协程的[Job]被取消或完成 * 函数被调用,或当它被挂起时,此函数 * 把[CancellationException]。...* 使用[isCompleted]检查该作业是否已完成,无需等待。 * * 有一个[cancelAndJoin]函数,它结合了[cancel]和' join '的调用。

1K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    操作系统高频面试题(2022最新整理)

    比如监听线程和工作线程是两个线程,这样监听就负责监听,工作的就负责工作,监听到用户请求马上把请求转到工作线程去处理,监听线程继续监听 什么是协程? 协程是一种用户态的轻量级线程。...协程不是由操作系统内核管理,而是完全由用户程序所控制,这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。 协程可以理解为可以暂停执行的函数。它拥有自己的寄存器上下文和栈。...线程和协程有什么区别呢? 1、线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。2、线程是协程的资源。...协程通过 可以关联任意线程或线程池的执行器(Interceptor)来间接使用线程的资源的。...短作业优先:非抢占式的调度算法,按估计运行时间最短的顺序进行调度。长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。

    58920

    Python进阶系列连载(7)——生成器(下)

    多任务——协程 我们先介绍一下多任务 多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务 简单点说,就是 你现在可能边看这篇文章边听着音乐 而看文章是一个任务(这里的任务指正在做的事情...) 听音乐也是一个任务 你同时在做这两件事 就是多任务啦 电脑和人还是不一样的 我们今天讲一下协程来完成多任务(之后还会讲到线程、进程来完成多任务) 考虑一个工厂流水线 A机器每次将一件货物放入箱子 B...机器每次将A机器的箱子封箱打包 为了不产生问题,必须A完成一个,B接着完成一个 并且看起来两个任务是同时执行的!...在Python中可以用生成器实现简单的协程: 我们来看这个程序,先定义了两个生成器(不是函数哦~原因在之前课程讲过) 当我们在while主程序中,先使用f1....今天作业: 敲一遍代码,理解一下两种生成器创建方式 自己不敲代码永远学不会写代码 下课 人生苦短,我选Python 未完待续,连载中......

    59970

    1小时,不会代码的我如何完成 网易云音乐 大作业网页制作?(IVX 第2篇)

    ,但是划水了一个学期不会做怎么办啊!...小媛:嗯,但是我不会做,头大,感觉又要挂科了,这个作业占一半的分数。 1_bit:看吧,所以一直叫你认真学,你看,期末了交不上作业了吧? 小媛:bit 哥帮一下我嘛。...1_bit:你不会是想叫我帮你写作业吧?不不不,不帮不帮,你要认真学习,我教你做。 小媛:可是明天就要交作业了,我不会搞怎么办? 1_bit:你的作业是什么? 小媛:我分到的是仿一个网易云音乐首页。...1_bit:简单,你直接可以使用一个像 PS 一样的编辑器绘制出一个网页,然后把那个 HTML 导出,这样你就可以完成你的作业了。 小媛:还可以这样?...此时我们可以点击行,可以看到行的宽度是 100%,意思则是这个行就占据整个浏览器窗口的整一行,不管你如何拖拽更改浏览器大小,这一行打大小永远是 100%。 小媛:原来如此。

    1.9K30

    【Kotlin 协程】Channel 通道 ① ( Channel#send 发送数据 | Channel#receive 接收数据 )

    Channel 通道 是 并发的安全队列 , 不同的协程之间 可以 借助 Channel 通道 进行通信 ; 协程 中 也涉及到 生产消费模式 , 生产者 协程 产生数据 , 将数据通过 Channel...发送元素 的操作是不执行的 ; Channel 通道 与 Flow 异步流是不同的 , 生产者协程 产生数据 和 消费者协程 消费数据 是同时进行的 ; 二、Channel#send 发送数据 ---...如果当前协程的[Job]被取消或完成 * 函数挂起后,该函数立即恢复并返回[CancellationException]。 * 有**立即取消保证**。...如果作业被取消,而此函数被取消 * 暂停,将无法成功恢复。'...如果当前协程的[Job]被取消或完成 * 函数挂起后,该函数立即恢复并返回[CancellationException]。 * 有**立即取消保证**。

    87020

    PlayWright(四)- 深入异步

    我们来看下异步运行 PlayWright 1、异步的概念 异步举例来讲下: 小明在家需要完成如下事情: 电饭锅煮饭大约30分钟 洗衣机洗衣服大约40分钟 写作业大约50分钟 在同步情况下:小明需要电饭锅处等待...同步需要按照顺序执行,等结束之后再执行下一个 异步可以上件事没结束就处理另一件事 2、asyncio异步协程 asyncio是python用来处理并发的一个包,我们的异步运行需要这个包 先导入 import...asynico 并且在python3.5后我们都用async/await来实现协程 异步函数 async def haha(): # async前缀异步函数 return 1 我们直接调用异步函数...我们可以使用异步调用 import asyncio async def haha(): # async前缀异步函数 return 1 asyncio.run(haha()) 使用异步调用就不会报错了...那await怎么使用呢 可以在操作前放入前缀 await,意思可以挂起自身的协程,然后等待这步操作完成,然后接着运行 3、异步运行playwright import asyncio from playwright.async_api

    60320

    【Kotlin 协程】协程取消 ② ( CPU 密集型协程任务取消 | 使用 isActive 判定协程状态 | 使用 ensureActive 函数取消协程 | 使用 yield 函数取消协程 )

    ") } } } 协程声明周期状态 参考 【Kotlin 协程】协程启动 ⑥ ( 协程生命周期状态 | 新创建 New | 活跃 Active | 完成中 Completing...* * 如果作业不再活动,则抛出[CancellationException]。 * 如果作业被取消,则抛出异常包含原始的取消原因。...* 如果在调用此挂起函数时取消或完成当前协程的[Job] * 这个函数正在等待调度,它会以[CancellationException]恢复。 * 有**立即取消的保证**。...如果在此函数被取消时作业被取消 * 挂起后,它将无法成功恢复。有关底层细节,请参阅[suspendCancellableCoroutine]文档。...* 如果上下文中没有[CoroutineDispatcher],它就不会挂起。

    1.1K20

    【Kotlin 协程】协程启动 ④ ( 协程启动模式 | 协程构建器启动模式参数 | DEFAULT 模式 | ATOMIC 模式 | LAZY 模式 | UNDISPATCHED 模式 )

    * 得到的协程与其他语言中的类似原语相比有一个关键的区别 * 和框架:它取消父作业(或外部作用域)在执行*结构化并发*范式失败。...* 父作业也从[CoroutineScope]继承,但它也可以被覆盖 * 使用相应的[上下文]元素。 * * 默认情况下,协程是立即调度执行的。...* * 如果协程[Job]在它甚至有机会开始执行之前被取消,那么它将不会启动它的 * 执行,但将以异常完成。...* * 如果协程[Job]在它甚至有机会开始执行之前被取消,那么它将不会启动它的 * 执行,但将以异常完成。...,嵌套的未分派协程不会形成 * 在无限制嵌套的情况下防止潜在堆栈溢出的事件循环。

    1.1K10

    GoLang协程与通道---中

    只有在当需要告诉接收者不会再提供新的值的时候,才需要关闭通道。只有发送者需要关闭通道,接收者永远不会需要。...如果消费者协程在独立的内核运行,就有可能让协程不会出现阻塞。 由于容器中元素的数量通常是已知的,需要让通道有足够的容量放置所有的元素。这样,迭代器就不会阻塞(尽管消费者协程仍然可能阻塞)。...---- 使用 select 切换协程 从不同的并发执行的协程中获取值可以通过关键字select来完成,它和switch控制语句非常相似也被称作通信开关;它的行为像是“你准备好了吗”的轮询机制;select...因为对一个nil的channel发送和接收操作会永远阻塞,在select语句中操作nil的channel永远都不会被select到。...(timeoutNs) 对应的 case,因此协程可能不会严格按照定时器设置的时间结束。

    82710

    c++20的协程学习记录(一): 初探co_await和std::coroutine_handle

    二、C++20的协程 C++20在语言层面上支持协程,这极大地改进编写事件驱动代码的过程。 这篇文章会先探索C++20协程,之后会举例说明这个事件驱动如何用协程优雅地完成。...这里注意到,步骤 3 中的方法返回时不会将控制权返回给协程。仅当调用步骤 2 中的可调用函数时,协程才会恢复执行。...为了避免内存泄漏,通常必须通过调用该 coroutine_handle::destroy方法来销毁协程状态(协程可以在完成时销毁自身,但是这个协程是个死循环,所以要显式调用destroy方法)。...2.2 使用方法 从例子开始 - 声明一个函数(协程)。辨别协程函数的要点是有一个co_await操作符,操作符上面和下面的代码不会被cpu连续执行到。...如果返回 true,则co_await不会暂停该函数。比如说我将return false改成return true。这个例子的协程就不会停止。

    1.4K10

    Golang:线程 和 协程 的区别

    现在的总结更多是放在了草稿 而没有发出,这次详细分享下在 Go 中,线程和协程的区别及其关系。 协程 协程,英文名Coroutine。但在 Go 语言中,协程的英文名是:gorutine。...它常常被用于进行多任务,即并发作业。没错,就是多线程作业的那个作业。 虽然在 Go 中,我们不用直接编写线程之类的代码来进行并发,但是 Go 的协程却依赖于线程来进行。 下面我们来看看它们的区别。...可能是: 65 66 1 2 3 67 意味着在执行协程A的过程中,可以随时中断,去执协程行B,协程B也可能在执行过程中中断再去执行协程A。...看起来协程A 和 协程B 的运行像是线程的切换,但是请注意,这里的 A 和 B 都运行在同一个线程里面。它们的调度不是线程的切换,而是纯应用态的协程调度。 关于上述代码中,为什么要指定下面两行代码?...和线程的整体对比 比较的点 线程 协程 数据存储 内核态的内存空间 一般是线程提供的用户态内存空间 切换操作 操作最终在内核层完成,应用层需要调用内核层提供的 syscall 底层函数 应用层使用代码进行简单的现场保存和恢复即可

    2.7K40

    用好工作池 WaitGroup

    WaitGroup 用于等待一批 Go 协程执行结束。程序控制会一直阻塞,直到这些协程全部执行完毕。假设我们有 3 个并发执行的 Go 协程(由 Go 主协程生成)。...Go 主协程需要等待这 3 个协程执行结束后,才会终止。...image.png 下面是waitGroup 的使用说明 1.WaitGroup 是一个等待协程完成的结构体 2.主协程通过调用Add 方法设置等待协程的数量 3.每个子协程完成的时候,需要调用Done...方法,那么等待的协程数量会自动减一 4.wait方法主要告诉协程,开启等待模式,知道所有的协程完成工作 注意事项 go login(&wg) 我们一定要传递指针类型的变量,因为sync.WaitGroup...我们工作池的核心功能如下: 创建一个 Go 协程池,监听一个等待作业分配的输入型缓冲信道。 将作业添加到该输入型缓冲信道中。 作业完成后,再将结果写入一个输出型缓冲信道。

    67230

    Android面试题之Kotlin协程一文搞定

    事实上await()也不一定导致协程会被挂起,await() 只有在 async 未执行完成返回结果时,才会挂起协程。...Job实例,该实例时协程的唯一标识,负责管理协程的生命周期 一个任务包含一系列状态:新创建(New)、活跃(Active)、完成中(Completing)、已完成(Completed)、取消中(Canceling...当所有子协程都完成后,协程会进入已取消(Cancelled)状态,此时isCompleted=true 协程完成,可能是正常完成,也可能是被取消了 等待一个作业 由launch启动的协程用join()方法...,一个子协程失败了,不会影响其他兄弟协程,但如果是作用域有异常失败了,则所有的子协程都会失败退出 coroutineScope和CoroutineScope coroutineScope是一个挂起函数,...都能够进行解构化并发,可以很好的管理多个子协程 协程的取消 取消作用域会取消它的子协程 被取消的子协程不会影响其余兄弟协程 协程通过抛出一个特殊的异常CancellationException来处理取消操作

    19610

    Kotlin---协程的使用

    DefaultDispatcher-worker-1 @coroutine#1 可以看到通过GlobalScope.launch完成了: 启动了新的线程,在该线程中创建了一个协程@coroutine#1...并且这样执行的协程,并不会阻塞主线程的执行 delay函数只能在协程中使用,否则编译不过,尽量避免使用GlobalScope.launch创建协程,当我们使用 GlobalScope.launch 时...如果我们忘记保持对新启动的协程的引用,它还会继续运行。 阻塞的协程runBlocking GlobalScope.launch启动了一个线程创建新的协程,并没有阻塞当前线程。...,并且不会阻塞当前线程 在runBlocking中调用launch()会在当前线程中执行协程 main @coroutine#1...launch 2 coroutines main @coroutine...val job = GlobalScope.launch { // 启动一个新协程并保持对这个作业的引用 delay(1000L) println("Hello,...

    1.3K20

    在 Android 开发中使用协程 | 上手指南

    但是请注意,这段代码不会显式地等待所创建的两个协程完成任务后才返回,当 fetchTwoDocs 返回时,协程还正在运行中。...Kotlin 确保使用 coroutineScope 构造器不会让 fetchTwoDocs 发生泄漏,coroutinScope 会先将自身挂起,等待它内部启动的所有协程完成,然后再返回。...即使是启动一个新的协程,也不会出现泄漏,因为在新的协程完成之前,调用方始终处于挂起状态。...,它将不会按照结构化并发的方式启动新的协程。...在这段代码中错误将会丢失,因为 async 假设您最终会调用 await 并且会重新抛出异常,然而您并没有去调用 await,所以异常就永远在那等着被调用,那么这个错误就永远不会得到处理。

    1.5K20

    浅学操作系统:进程

    协程:协程是用户态的轻量级线程,不受操作系统的调度,而是由程序员或者库来控制。协程可以在⼀个线程中切换执⾏多个任务,实现了异步编程的效果。协程的创建和销毁完全由用户空间完成,开销非常小。...特点:线程的切换由操作系统负责调度,协程由用户自己进行调度,因此减少了上下文切换,提高了效率。线程的默认Stack大小是1M,而协程更轻量,接近1K。因此可以在相同的内存中开启更多的协程。...线程和协程的区别:协程内存占用小,创建和销毁消耗小,协程之间切换的代价小。三者的区别:资源分配:进程是资源分配的单位,线程和协程是资源调度的单位。...地址空间:进程有独⽴的地址空间,线程共享进程的地址空间,协程也共享所在线程的地址空间。调度⽅式:进程和线程由操作系统调度,协程由⽤⼾或者库调度。开销大小:进程的开销最⼤,线程次之,协程最⼩。2....阻塞状态(Blocked):进程因为某些原因(⽐如等待I/O操作完成)⽽暂时⽆法运⾏,在这个状态 下,进程不会占⽤CPU资源。

    29110
    领券