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

kotlin 协程入门教程

至于 挂起函数 通过挂起与恢复解决了开发过程中的回调地狱问题。而结构化并发 则可以对一组协程进行统一的操作。关于它们的详细介绍,可以继续往下面看。...挂起函数 挂起函数是指方法声明前加上 suspend 关键字的函数。它的作用主要是挂起与恢复。其实说挂起和恢复比较难理解,其实简单的说挂起就是协程任务从当前线程脱离,恢复则是协程任务回到了原线程。...,协程会从主线程会切换到子线程,并执行网络请求任务;当请求任务执行完成后则回到了主线程。...通过控制父协程,从而控制它的一堆子协程。...如下图所示,当子协程1发生异常时,它会先会传递给父协程,再从父协程传播到子协程2和3,从而影响所有的协程。 如果想要子协程1发生异常时,不影响其他的协程,可以使用 SupervisorJob。

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

    【linux】进程状态与优先级

    ,而子进程在完成一定次数的迭代后自行终止。...init进程会定期调用 wait() 收集其子进程的状态,因此可以自动清理僵尸进程。 发送信号:在某些情况下,如果父进程未正确处理子进程的终止,可以考虑结束父进程(确保做到安全和适当)。...结束父进程后,其所有子进程将由init进程接管,这通常会清理掉任何僵尸状态的子进程。...03.孤儿进程 通常,孤儿进程产生于以下情况: 父进程执行完毕或异常终止,而子进程仍在运行。 子进程由于某种原因被忽略或未能被父进程正确管理(如未调用wait()检查子进程状态)。...资源管理:挂起状态使操作系统能够更灵活地管理有限的资源,如内存、处理器时间等,特别是在多任务环境下。 用户控制:用户或系统管理员可以根据需要挂起和恢复进程,以便对系统资源进行手动调整。

    20120

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

    ,稍后再在挂起得位置恢复 挂起函数 使用suspend关键字修饰的函数 挂起函数只能在协程体内或其他挂起函数内调用 挂起和阻塞的区别 挂起不会阻塞主线程,主线程可以正常刷新UI,但阻塞就会导致主线程ANR...事实上await()也不一定导致协程会被挂起,await() 只有在 async 未执行完成返回结果时,才会挂起协程。...阻塞 子协程都执行完毕后才退出 withContext 不是 任务之间是串行 否 可以直接返回耗时任务结果,协程体最后一行内容 doAsync和async doAsync 的源码它的实现都是基于Java...和CoroutineScope coroutineScope是一个挂起函数,是协程作用域构建器,CoroutineScope()是一个普通函数 coroutineScope后面的协程作用域的协程上下文是继承父协程作用域的上下文...: break println(line) } } 不能取消的任务 协程被取消后,finally里面还有挂起函数,可以用withContext(NonCancellable)

    19610

    前端工程师的自我修养:React Fiber 是如何实现更新过程可控的

    更新过程的可控主要体现在下面几个方面: 任务拆分 任务挂起、恢复、终止 任务具备优先级 1....return FiberNode } 挂起 当第一个小任务完成后,先判断这一帧是否还有空闲时间,没有就挂起下一个任务的执行,记住当前挂起的节点,让出控制权给浏览器执行更高优先级的任务。...恢复 在浏览器渲染完一帧后,判断当前帧是否有剩余时间,如果有就恢复执行之前挂起的任务。如果没有任务需要处理,代表调和阶段完成,可以开始进入渲染阶段。这样完美的解决了调和过程一直占用主线程的问题。...currentFiber.sibling){ return currentFiber.sibling } currentFiber = currentFiber.return; } } 在一次任务结束后返回该处理节点的子节点或兄弟节点或父节点...任务具备优先级 React Fiber 除了通过挂起,恢复和终止来控制更新外,还给每个任务分配了优先级。

    1.4K20

    写给Android工程师的协程指南

    协程 在维基百科中,是这样解释的: 协程是计算机程序的一类组件,推广了协作式多任务的子例程,允许执行被挂起与被恢复。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。...从调度方式而言 线程池通过创建一个固定数量的线程池来执行并发任务。每个任务将在一个可用的线程上运行,任务执行结束后,线程将返回线程池以供以后使用,并且通过在队列中等待任务来保持活动状态。...这里使用了 SupervisorJob() 的原因是,协程的异常是会传递的,比如当一个子协程发生异常时,它会影响它的兄弟协程与它的父协程。...并定义了挂起函数作为相应的子任务,其内部采用了状态机的思想,用于实现协程中的挂起与恢复。 在挂起与恢复的实现上,使用了 suspend 关键字标记的函数被称为挂起函数。...而当我们最底层的方法执行结束后,此时就会再次触发父 ContinuationImpl 内部的 invokeSuspend() 方法,从而回到调用方的逻辑内部,从而完成挂起函数的恢复。

    1.5K40

    揭秘kotlin协程中的CoroutineContext

    ] 所以异常传播就是这个Job因为除了CancellationException以外的异常而失败时,那么父Job就会感知到并抛出异常,在抛出异常之前,父Job会取消所有子Job的运行,这也是结构化编程的一个特点...2.2、Unconfined Dispatchers.Unconfined的含义是不给协程指定运行的线程,在第一次被挂起(suspend)之前,由启动协程的线程执行它,但被挂起后, 会由恢复协程的线程继续执行..., 如果一个协程会被挂起多次, 那么每次被恢复后, 都有可能被不同线程继续执行,看下面的一个例子: fun main(){ GlobalScope.launch(Dispatchers.Unconfined...后协程恢复能够被恢复协程的线程执行的原因。...还有子协程抛出的未捕获异常会委托父协程的CoroutineExceptionHandler处理,子协程设置的CoroutineExceptionHandler永远不会生效(SupervisorJob 除外

    1.9K31

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

    , 该 launchJob 协程任务执行完毕后 , 才会执行后面的 launch 协程任务 ; runBlocking { // 调用 runBlocking 函数 , 可以将 主线程 包装成...* * 注意,只有当所有子任务都完成时,作业才算完成。 * * 这个挂起函数是可取消的,并且**总是**检查是否取消了调用协程的Job。...* * 特别是,它意味着父协程在子协程上调用' join '时抛出 * [CancellationException]如果子进程失败,因为子进程的失败会默认取消父进程, * 除非子进程是从[supervisor...() 函数会挂起协程 , 该 asyncDeferred 协程任务执行完毕后 , 才会执行后面的 async 协程任务 ; runBlocking { // 调用 runBlocking 函数...如果在此函数被取消时作业被取消 * 挂起后,它将无法成功恢复。有关底层细节,请参阅[suspendCancellableCoroutine]文档。

    1K20

    操作系统-进程管理

    进程的控制 操作系统允许一个进程创建子进程,而且允许子进程继承父进程所拥有的资源,当子进程被终止时,其在父进程处继承的资源需要还给父进程。...,将CPU资源分配给其他进程 如果还有子进程,则需要将所有的子进程终止 将该进程所拥有的全部资源归还给父进程或操作系统 将其从PCB所在队列中删除 CPU上下文切换 在运行每一个任务时,CPU都需要知道任务从哪里加载...CPU上下文的切换就是把当前在运行的任务的CPU上下文保存起来,然后加载新任务的上下文到寄存器和程序计数器,然后跳转到程序计数器所指定的位置开始运行新任务。...当进程的时间片消耗完以后,进程从运行状态变为就绪状态 进程在系统资源不足时,需要等待资源满足以后才可以运行,这时进程会挂起,并由系统调度其他进程运行 当进程通过sleep等函数将自己主动挂起时 当优先级更高的进程运行时...,低优先级的运行进程会被挂起 当硬件发生中断时,CPU上的进程会被中断挂起,转而执行内核上的中断处理程序。

    63930

    进程处于挂起状态表示_挂起进程转换图

    总而言之引入挂起状态的原因有以下几种: 用户的请求:可能是在程序运行期间发现了可疑的问题,需要暂停进程。 父进程的请求:考察,协调,或修改子进程。...操作系统的需要:对运行中资源的使用情况进行检查和记账。 负载调节的需要:有一些实时的任务非常重要,需要得到充足的内存空间,这个时候我们需要把非实时的任务进行挂起,优先使得实时任务执行。...定时任务:一个进程可能会周期性的执行某个任务,那么在一次执行完毕后挂起而不是阻塞,这样可以节省内存。...挂起(suspend)不释放CPU,如果任务优先级高就永远轮不到其他任务运行。一般挂起用于程序调试中的条件中断,当出现某个条件的情况下挂起,然后进行单步调试。...与调度器是否相关:任务调度是操作系统来实现的,任务调度时,直接忽略挂起状态的任务,但是会顾及处于pend下的任务,当pend下的任务等待的资源就绪后,就可以转为ready了。

    1.4K20

    带你通过字节跳动面试---操作系统复习

    僵尸进程 正常进程 正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。但子进程的结束和父进程的运行是一个异步过程,也就是说父进程无法预知子进程什么时候结束。...一个进程完成他的工作后,它的父进程要调用 函数来收集子进程的终止状态,并把他彻底销毁后返回,如果没有等到这样的一个子进程,就会阻塞在这里等待。...孤儿进程 如果一个父进程推出,而他的子进程还在运行,那么这些子进程就变成了孤儿进程。孤儿进程会由 进程收养。...内部解决 子进程退出时向父进程发送信号,父进程接收到信号时,在信号处理中调用 处理僵尸进程 两次 :父进程 后马上 ,子进程在 一次后马上 ,孙进程完成父进程中本来要完成的事情...但存在一些区别: 的子进程拷贝父进程的地址空间, 的子进程和父进程共享地址空间。 的子进程和父进程执行顺序不定, 保证子进程先执行,父进程在执行。

    1.4K20

    【Linux】关于进程的理解、状态、优先级和进程切换

    对于阻塞状态和挂起状态,阻塞不一定挂起,挂起一定是阻塞 这些都是概念性的,对于Linux下具体的又是什么样子的呢 ---- 二、Linux进程状态 为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态...| grep -v grep; sleep 1; done 右侧运行一段时间后出现Z状态: defunct的意思是失效的,也就是进程是已经死亡的,但是没有被回收。...僵尸进程的危害 进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。...话不多说,我们直接通过一小段代码来看一看: 先来看一看z状态(杀掉子进程): 现在重新启动进程(杀掉父进程): 父进程结束掉没有看到它的僵尸状态:父进程也有父进程,都是bash的子进程,所以bash...,这里简单理解为临时数据保存至PCB里,而当进程恢复运行的时候,要进行上下文的恢复,该进程在次回到CPU继续运行时,重新加载恢复这些数据。

    2.7K20

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

    launch 启动协程 , 该协程运行在主线程中 , 运行到 delay(2000) 代码时 , 该 delay 函数是挂起函数 , 主线程会被挂起 , 主线程被调度器调度 , 执行其它的操作 如 刷新..., 则协程直接取消 ; 如果在主线程中执行协程 , 协程挂起后 , 主线程继续执行其它任务, 如刷新 UI 等 , 主线程不会阻塞 , 挂起函数会在子线程中执行 ; 一般会将耗时操作放在 协程的挂起函数..., 立即在当前的 函数调用栈 执行协程任务 , 直到遇到第一个挂起函数 , 才在子线程中执行挂起函数 ; 如果在主线程中启动协程 , 则该模式的协程就会直接在主线程中执行 ; 如果在子线程中启动协程 ,...: ${Thread.currentThread()}") // 遇到挂起函数会在子线程执行该挂起函数 // 挂起函数都是耗时任务 delay(2000...但是,当从挂起恢复协程时 * 它根据上下文中的[CoroutineDispatcher]进行分派。

    1.1K10

    Kotlin 协程之Practice

    Kotlin 协程作用 让线程主动释放CPU是协程一个作用,一个协程执行后挂起,然后让另一个协程执行, 等到这个协程执行完毕再让前一个协程继续执行。...它启动了一个新的协程作用域并且在所有子协程执行结束后并没有执行完毕。     ...挂起后,它将完全由所运行的线程中恢复挂起函数,     //非受限调度器是合适的,它在协程没有消耗CPU时间或共享数据时被限制在指定线程中     fun testDispatcherMain() =...")     }       //父协程总是等待所有子协程执行结束,父协程不会跟踪子协程也不必调用join方法在最后等待子协程     /**      * 输出      *  request...它将会被取消     //但它父协程将不会被取消,因为无理由取消父协程只会取消其子协程而不是取消其自身     /**      * 输出      * Cancelling child

    1.2K20

    理解操作系统进程--进程描述

    计算机程序是为执行某些任务而开发的。典型情况下,它们接受外来的输入,做一些处理后,输出结果。 直接根据给定的硬件平台写应用程序效率是低下的 开发操作系统是为了给应用程序提供一个方便、安全和一直的接口。...简单来说,程序只有两种状态:运行态、未运行态。 ? 当操作系统创建一个新进程时,它将该进程以未运行态加入到系统中,操作系统知道进程的存在,并等待执行机会。...当前运行的进程不时中断,操作系统的分派器将选择一个新进程运行。 前一个进程从运行态转换到未运行态,另一个从未运行态转换到运行态。 同时,未运行的进程需保持在某种类型的队列中,并等待它们的执行时机。...就绪-退出: 在某些系统中,父进程可以在任何时候终止一个子进程。如果一个父进程终止,与该父进程相关的所有子进程都将被终止。...,包括将进程的状态变为运行态 更新内存管理的数据结构 恢复处理器在被选择的进程最近一次切换出运行态时的上下文环境。

    72021

    Kotlin协程解析系列(上):协程调度与挂起

    协程: 一种非抢占式或者协作式的计算机程序并发调度实现,程序可以主动挂起或者恢复执行,其核心点是函数或一段程序能够被挂起,稍后再在挂起的位置恢复,通过主动让出运行权来实现协作,程序自己处理挂起和恢复来实现程序执行流程的协作调度...当父Job被取消后,所有的子Job也会被自动取消。 当子Job被取消或者出现异常后父Job也会被取消。 具有多个子 Job 的父Job 会等待所有子Job完成(或者取消)后,自己才会执行完成。...supervisorScope 与coroutineScope类似,不同的是子协程的异常不会影响父协程,也不会影响其他子协程。...“挂起”是指协程从它当前线程脱离,切换到另一个线程运行。当线程运行到suspend函数时,会暂时挂起这个函数及后续代码的执行。简而言之,挂起函数是一个可以启动、暂停和恢复的函数。...调度器即确认相关协程在哪个线程上执行,调度的本质是解决挂起恢复后协程逻辑在哪里运行的问题,其继承自拦截器。

    2K40

    FreeRTOS源码探析之——任务调度相关

    3 运行态→就绪态:有更高优先级任务创建或者恢复后,会发生任务调度,此刻就绪列表中最高优先级任务变为运行态,那么原先运行的任务由运行态变为就绪态,依然在就绪列表中,等待最高优先级的任务运行完毕继续运行原来的任务...5 阻塞态→就绪态:阻塞的任务被恢复后(任务恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的任务会被加入就绪列表,从而由阻塞态变成就绪态;如果此时被恢复任务的优先级高于正在运行任务的优先级...9 挂起态→就绪态:把 一 个 挂 起 状态 的 任 务 恢复的 唯 一 途 径 就 是 调 用 vTaskResume() 或vTaskResumeFromISR() API 函数,如果此时被恢复任务的优先级高于正在运行任务的优先级...任务 Task2 运行够 5 个系统时钟节拍后,通过时间片调度切换到任务 Task3。...如果在挂起调度程序时中断请求上下文切换,则该请求将保持挂起状态,并且仅在重新启动调度程序(未挂起)时才执行该请求。

    1.4K21

    Linux云计算——进程和任务管理

    前言 本章将会讲解Linux云计算中的进程和任务管理 本章架构  一.程序和进程的关系 ①程序 保存在硬盘、光盘等介质中的可执行代码和数据 静态保存的代码 ②进程 在 CPU 及内存中运行的程序代码...动态执行的代码 父、子进程 每个进程可以创建一个或多个进程 二.查看进程信息 1.ps:查看静态的进程统计信息  [root@localhost ~]# ps -elf 2.top:查看动态的进程排名信息...                                          -t:指定终端 4.pstree命令 以树形结构列出进程信息 三.进程的前后台调度 1.进程的前后台调度 1>Ctrl+Z 组合键:将当前进程挂起...,即调入后台并停止执行 2>jobs 命令:查看处于后台的任务列表 3>fg 命令:将后台进程恢复到前台运行,可指定任务序号 2.终止进程的运行 (1)kill、killall 命令 1>kill用于终止指定...at 21:30 at> shutdown -h now at> job 2 at Sun May 7 21:30:00 2017 [root@localhost ~]# atq #查看未执行的任务列表

    30630

    Swift中的异步编程方式

    需要注意,理论上在异步函数中是不允许使用Thread相关接口的,因为任务的挂起和恢复所在线程都是由系统调度的,逻辑上开发者无需关心线程问题,在Swift6版本中继续这样使用将会报错。...上面演示的代码中,test1和test2任务的执行并不依赖关系,如果test2和执行是需要test1执行结束的,则可以直接使用await关键字来将运行挂起,直到结果返回。...3.非结构化的子任务代码块中。...任务组与任务 当有多个异步任务需要执行时,可以将其添加到一个任务组中,当任务组所有任务完成后再进行统一的返回。...,线程资源会被释放去执行其他任务,直到异步任务有结果后,在恢复执行。

    46910

    Linux进程管理详细解读

    背景 Linux系统为多用户多任务系统 生物软件运行时要能够查看运行状态 实时监控软件运行状态 例如 CPU 内存使用情况等 当运行出现错误时 要能够及时杀死任务 以及任务前后台切换 是否挂起等操作...关闭登录窗口后程序继续运行 disown 忘记使用nohup之后,将后台任务转换为nohup 1 查看进程 进程查看可以使用 top 和 ps 命令,其中 top 可以动态查看...R(运行):进程正在运行或在运行队列中等待。 S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该状态。 D(不可中断):进程不响应系统异步信号,即便用kill命令也不能将其中断。...Z(僵死):进程已经终止,但进程描述符依然存在, 直到父进程调用wait4()系统函数后将进程释放。 T(停止):进程收到停止信号后停止运行。...+z暂停; bg 1;切换到后台运行; #5任务2切换到前台杀掉 bg 2 ctrl+c 3 任务管理 3.1nohup 非 挂起 nohup命令的全称为 “no hang up”,该命令可以将程序以忽略挂起信号的方式运行起来

    96530
    领券