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

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

函数参数原型 二、协程启动模式 1、DEFAULT 模式 2、ATOMIC 模式 3、LAZY 模式 4、UNDISPATCHED 模式 5、CoroutineStart 中定义的协程启动模式原型...; 上述代码中 , 调用 runBlocking 函数 , 可以将 主线程 包装成 协程 , launch 启动协程 , 该协程运行在主线程中 , 运行到 delay(2000) 代码时 , 该 delay..., 才在子线程中执行挂起函数 ; 如果在主线程中启动协程 , 则该模式的协程就会直接在主线程中执行 ; 如果在子线程中启动协程 , 则该模式的协程就会直接在子线程中执行 ; 代码示例 : Dispatchers.IO...* * 协程启动选项的汇总如下: * * [DEFAULT]——根据上下文立即安排协程执行; * * [LAZY]—只在需要时才启动协程; * * [ATOMIC]——原子地(以不可取消的方式)...*/ DEFAULT, /** * 只有在需要时才会惰性地启动协程。

1.1K10

破解 Kotlin 协程(2) - 协程启动篇

我们说过,启动协程需要三样东西,分别是 上下文、启动模式、协程体,协程体 就好比 Thread.run 当中的代码,自不必说。 本文将为大家详细介绍 启动模式。...但在开始运行之前无法取消 UNDISPATCHED 立即在当前线程执行协程体,直到第一个 suspend 调用 LAZY 只有在需要的情况下运行 2.1 DEFAULT 四个启动模式当中我们最常用的其实是...在 Nodejs 中,Kotlin 协程的默认调度器则并没有实现线程的切换,输出结果也会略有不同,这样似乎更符合 JavaScript 的执行逻辑。 更多调度器的话题,我们后续还会进一步讨论。...需要注意的是,cancel 调用一定会将该 job 的状态置为 cancelling,只不过 ATOMIC 模式的协程在启动时无视了这一状态。...,因此 1、2 会连续在同一线程中执行, delay 是挂起点,因此 3 会等 100ms 后再次调度,这时候 4 执行, join 要求等待协程执行完,因此等 3 输出后再执行 5。

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

    协程及Python中的协程

    我们把一个线程中的一个个函数叫做子程序,那么子程序在执行过程中可以中断去执行别的子程序;别的子程序也可以中断回来继续执行之前的子程序,这就是协程。...比较专业的理解是:   协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。...(2)进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序 2 Python中如何实现协程 2.1 yield实现协程   前文所述“子程序(函数)在执行过程中可以中断去执行别的子程序;别的子程序也可以中断回来继续执行之前的子程序...2.2 greenlet实现协程   Python的 greenlet就相当于手动切换,去执行别的子程序,在“别的子程序”中又主动切换回来。。。 greenlet协程例子: 1 #!...实现协程程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。

    1.3K20

    【Kotlin 协程】协程启动 ⑤ ( 协程作用域构建器 | runBlocking 函数 | coroutineScope 函数 | supervisorScope 函数 )

    : 协程任务 运行时 , 必须指定其 CoroutineScope 协程作用域 , 其会 追踪所有的 协程任务 , CoroutineScope 协程作用域 可以 取消 所有由其启动的协程任务 ; 结构化并发..., 将 主线程 或 子线程 包装成 协程体 , 在该协程中执行 协程任务 , 会 阻塞当前的线程 ; 函数原型如下 : public actual fun runBlocking(context...该协程会在另外的独立的线程执行 协程任务 , 不会干扰当前启动协程的线程 ; 函数原型如下 : public suspend fun coroutineScope(block: suspend...CoroutineScope.() -> R): R 共同点 : 这两个 协程作用域构建器 构建的协程 都会等待 协程体 中的所有 协程任务 和 子协程 执行完毕 ; 代码示例 : 在下面的代码中 ,...runBlocking 可以在普通的函数中执行 , 将主线程包装成了协程体 ; 但是 coroutineScope 函数 由于是 挂起函数 , 只能在 协程体 中使用 ; 该 coroutineScope

    53930

    【Kotlin 协程】协程启动 ③ ( 协程组合并发 | 挂起函数串行执行 | 协程组合并发执行挂起函数 )

    文章目录 一、挂起函数串行执行 二、协程组合并发执行挂起函数 一、挂起函数串行执行 ---- 在协程体中 , 连续使用多个挂起函数 , 这些函数的执行是顺序执行的 , 挂起函数 1 执行完毕后 , 才执行...setContentView(R.layout.activity_main) runBlocking { // 调用 runBlocking 函数 , 可以将 主线程 包装成 协程...---- 如果想要两个挂起函数并发执行 , 并且同时需要两个函数的返回值 , 则使用 async 协程构建器 , 启动两个协程 , 在协程体中执行两个并发函数 ; 代码示例 : package kim.hsl.coroutine...setContentView(R.layout.activity_main) runBlocking { // 调用 runBlocking 函数 , 可以将 主线程 包装成 协程...async 协程 , 并发执行两个挂起函数 , 耗时 355 ms , 达到了并发执行减少执行时间的目的 ; 00:18:50.081 I 两个返回值相加 3 00:18:50.081 I 挂起函数执行耗时

    70420

    【Kotlin 协程】协程启动 ① ( 协程构建器 | launch 构建器 | async 构建器 | runBlocking 函数 | Deferred 类 )

    ---- 1、协程构建器概念 协程 需要 协程构建器 来启动 , 协程构建器 就是 CoroutineScope 协程作用域的两个扩展函数 ; 协程构建器 : 协程有两种构建器 , 调用 CoroutineScope...协程作用域 的如下两个构建起可启动协程 ; launch 构建器 : 返回 Job 实例对象 , 该协程任务没有返回值 ; launch 函数是 CoroutineScope 协程作用域 类的扩展函数..., 这是顶级的协程 , 其 协程作用域是进程级别的 , 生命周期与应用进程同级 , 即使启动协程的对象被销毁 , 协程任务也可以继续执行 ; 调用 runBlocking 函数 , 可以将 主线程 包装成...协程 ; runBlocking { // 调用 runBlocking 函数 , 可以将 主线程 包装成 协程 } 在 runBlocking 代码块中 , 可以 直接调用 CoroutineScope...} 5、async 构建器示例 调用 Deferred#await() 函数 , 可以获取 协程任务 的返回值 , 类型是一个泛型 T , 即可以返回任意类型 , 如果在 async{} 协程体中返回

    48910

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

    获取当前是否处于 已完成状态 ; 取消中 Canceling 已取消 Cancelled : 通过调用 Job#isCancelled 获取当前是否处于 取消状态 ; 之前的博客 【Kotlin 协程...】协程启动 ④ ( 协程启动模式 | 协程构建器启动模式参数 | DEFAULT 模式 | ATOMIC 模式 | LAZY 模式 | UNDISPATCHED 模式 ) 中 , 提到的 取消 协程 后..., 进入 取消响应状态 , 需要 先进入 取消中 Canceling 状态 , 然后再进入 已取消 Cancelled 状态 ; 三、协程生命周期状态改变 ---- 通过 launch 或 async...协程完成分支 : 当有 子协程 完成时 , 会进入 完成中 Completing 状态 , 此时会等待其它子协程执行完毕 , 如果 所有的子协程都执行完毕 , 则进入 已完成 Completed 状态...; 协程取消分支 : 调用 Job#cancel() 函数 取消协程 , 会进入到 取消中 Canceling 状态 , 此时不会立刻取消 , 因为该协程中可能还有多个子协程 , 需要等待 所有子协程都取消后

    64910

    java协程框架quasar和kotlin中的协程

    接下来要分享的这个开源项目,正是解决了在java中只能使用多线程模型开发高并发应用的窘境,使得java也能像Go语言那样使用协程的语义开发了。...而且上面多线程编程时,并没有指定线程池的大小,在实际开发中是绝不允许的。一般我们会设置一个固定大小的线程池,因为线程资源是宝贵,线程多了费内存还会带来线程切换的开销。...上面的场景在设置200个固定大小线程池时。结果也是可预见的达到了50多秒。这个结果足以证明协程编程ko线程编程了。...java中的多线程操作。...java多线程写的一个多线程汇聚多个http接口的结果的接口时,通过ab压测他们两个的性能并没有很大的变化,最后了解到主要原因是这个时候,在协程里发起一个http的请求时,涉及到操作系统层面的socket

    54330

    kotlin--协程的启动和取消

    一、协程的启动 1.launch与async构建器都用来启动新协程 launch:我们之前已经使用过了GlobalScope的launch来启动协程,它返回一个Job async:返回一个Deferred...kotlin的协程有4中启动模式 1.DEFAULT:协程创建后,立即开始调度,在调度前如果被取消,直接进入取消响应状态 2.ATOMIC:协程创建后,立即开始调度,协程执行到第一个挂起点之前不响应取消...虽然无法直接访问这些状态,但我们可以通过访问Job的属性:isActive、isCanceled和isCompleted 8.协程的生命周期 如果协程处于活跃状态,协程运行出错或取消都会将该协程置为取消中状态...1.可以捕获取消异常,然后在finally中释放 2.use函数,该函数只能被实现了closeable的对象使用,程序结束时,会自动调用close方法,适合文件对象 4.不能取消的任务 处于取消中状态的协程不能被挂起...,如果想要协程取消后,还能调用挂起函数,我们需要将清理的代码放入NoCancellable CoroutineContext中 这样会挂起运行中的代码,并保持协程的取消中状态,直到任务处理完成 fun

    1K30

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

    87183425 一、launch 协程执行顺序控制 ---- 如果需要通过 launch 协程构建器 启动多个协程 , 后面的协程需要等待前面的协程执行完毕 , 在启动靠后的协程 , 实现方案如下 :...调用 Job#join() 函数 , 可以挂起协程 , 等待 launch 中协程体内的任务执行完毕 , 再执行后面的协程任务 ; 代码示例 : 下面的代码中 , 先执行 launchJob 协程 ,...如果[Job]仍然处于_new_状态,则启动]相应的协程。 * * 注意,只有当所有子任务都完成时,作业才算完成。...---- 如果需要通过 async 协程构建器 启动多个协程 , 后面的协程需要等待前面的协程执行完毕 , 在启动靠后的协程 , 实现方案如下 : 调用 Deferred#await() 函数 , 可以挂起协程..., 等待 async 中协程体内的任务执行完毕 , 再执行后面的协程任务 ; 代码示例 : 下面的代码中 , 先执行 asyncDeferred 协程 , 调用 asyncDeferred.await

    1K20

    Kotlin中的协程及在Android中的应用

    (Dispatchers.IO){ } 这两种方式都是在指定的 IO 调度器中启动一个协程,但它们之间有一些区别: GlobalScope.launch(Dispatchers.IO){} 是在全局范围内启动一个协程...CoroutineScope(Dispatchers.IO).launch {} 是在指定的 CoroutineScope 中启动一个协程,通常情况下应该手动创建 CoroutineScope 对象,并确保在合适的时机取消该...这样做更加可控,可以更好地管理协程的生命周期。 因此,建议在大多数情况下使用 CoroutineScope 来启动协程,以便更好地管理协程的生命周期。...: 3 运行时间: 2009 协程的启动模式 我们在查看launch和async扩展函数时,还有第二个参数,start: CoroutineStart,这个参数的含义就是协程的启动模式, public...ATOMIC 在协程创建后立即开始调度,但它和DEFAULT模式是有区别的,该模式下协程启动以后需要执行到第一个挂起点才会响应cancel操作。

    19010

    【Kotlin 协程】协程异常处理 ① ( 根协程异常处理 | 自动传播异常 | 在协程体捕获异常 | 向用户暴露异常 | 在 await 处捕获异常 | 非根协程异常处理 | 异常传播特性 )

    文章目录 一、协程异常处理 二、根协程自动传播异常 1、异常抛出点 ( 协程体抛出异常 ) 2、异常捕获点 ( 在协程体捕获异常 ) 三、根协程向用户暴露异常 1、异常抛出点 ( 在 await、...receive 处抛出异常 ) 2、异常捕获点 ( 在 await、receive 处捕获异常 ) 四、非根协程异常处理 五、异常传播特性 一、协程异常处理 ---- 在 协程任务 中 , 执行的代码出现异常...( 协程体抛出异常 ) launch 构建器 异常代码示例 : 使用 launch 构建器创建协程 , 在协程任务中抛出异常 , 查看异常的抛出点 ; package kim.hsl.coroutine...) 异常捕获代码示例 : 在协程任务代码中可能抛出异常的代码处捕获异常 ; package kim.hsl.coroutine import android.os.Bundle import androidx.appcompat.app.AppCompatActivity...根协程 的异常传播 ; 1、异常抛出点 ( 在 await、receive 处抛出异常 ) 代码示例 : 在下面的代码中 , 如果不调用 async 构建的 Deferred 协程任务 的 await

    78210

    GoLang协程与通道---中

    GoLang协程与通道---中 协程的同步:关闭通道-测试阻塞的通道 使用 select 切换协程 通道、超时和计时器(Ticker) 习惯用法:简单超时模式 协程和恢复(recover) ---- 协程的同步...比如,缓冲大小为 100,迭代器在阻塞之前,至少可以从容器获得 100 个元素。如果消费者协程在独立的内核运行,就有可能让协程不会出现阻塞。...先创建一个信号通道,然后启动一个 lambda 协程,协程在给通道发送数据之前是休眠的: timeout := make(chan bool, 1) go func() { time.Sleep...可以在 select 中通过 time.After() 发送的超时信号来停止协程的执行。...但是恢复是在 panicking 的协程内部的:不能被另外一个协程恢复。 ----

    82710

    Golang中的协程(goroutine)

    进程         进程就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。...并行可以显著提高程序的性能,特别是在多核 CPU 中,能够利用多个 CPU 核心进行计算。...Go 语言中的协程是由 Go 运行时调度器(scheduler)进行管理和调度的。当程序启动时,Go 运行时会默认启动一个主协程,主协程会创建其他的子协程,这些协程会被分配到不同的系统线程上进行执行。...当某个协程发生阻塞时,Go 运行时会将该协程挂起并让出 CPU,转而执行其他协程,以充分利用系统资源。 在 Go 语言中,创建协程非常简单,只需要在函数调用前加上 go 关键字即可。...} 多协程和多线程         Golang中每个goroutine(协程)默认占用内存比Java、C的线程少。

    66640

    协程中的“协”字是什么意思?

    在Golang中,协程被实现为“goroutine”,它是Go语言并发设计的核心。Goroutine在使用和概念上与传统的协程有所不同,但基本思想是相通的。...“协”是否可以代表为用户态调度是协作式的 在协程(coroutine)的上下文中,“协”是可以理解为协作式的(cooperative),特别是在强调与用户态调度相对应的场景中。...协作式调度 在协作式调度中,每个任务(在这里指协程)自行决定何时让出CPU给其他任务运行。...这意味着一个运行中的协程会一直执行,直到它显式地表示要让出执行权(例如,通过等待I/O操作、显式挂起或调用其他协程等方式)。...因此,“协”在协程中确实可以理解为强调了协作式的调度方式,这是区别于传统线程抢占式调度的一个重要特点。

    10500

    揭秘kotlin协程中的CoroutineContext

    前言 -- 从kotlin1.1开始,协程就被添加到kotlin中作为实验性功能,直到kotlin1.3,协程在kotlin中的api已经基本稳定下来了,现在kotlin已经发布到了1.4,为协程添加了更多的功能并进一步完善了它...就像提到线程,很多人会把它和进程进行比较,线程和进程分别是操作系统中的CPU调度单位和资源划分单位,它们在操作系统中有专门的数据结构代表,而协程在操作系统中没有专门的数据结构代表,所以协程并不是由操作系统创建和调度...,例如启动一个协程1,在协程中继续启动协程2、协程3,那么协程1就是协程2、协程3的父协程,协程2、协程3就是协程1的子协程,每个协程都会有一个对应的Job,协程之间的父子关系是通过Job对象维持的,像一颗树一样...Dispatchers.Unconfined,所以第一次执行时是由启动协程的线程执行,上面在主线程中启动了协程,所以第一次输出主线程main,withContext方法是一个suspend方法,它可以挂起当前协程...,用来处理协程运行中未捕获的异常,每一个创建的协程默认都会有一个异常处理器,我们可以在启动协程时通过CoroutineContext指定我们自定义的异常处理器,我们可以通过CoroutineExceptionHandler

    1.9K31

    Java 中的协程库 - Quasar

    一、协程 一个进程可以产生许多线程,每个线程有自己的上下文,当我们在使用多线程的时候,如果存在长时间的 I/O 操作,线程会一直处于阻塞状态,这个时候会存在很多线程处于空闲状态,会造成线程资源的浪费。...这就是协程适用的场景。...协程,其实就是在一个线程中,有一个总调度器,对于多个任务,同时只有一个任务在执行,但是一旦该任务进入阻塞状态,就将该任务设置为挂起,运行其他任务,在运行完或者挂起其他任务的时候,再检查待运行或者挂起的任务的状态...协程的方式更多用来做阻塞密集型(比如 I/O)的操作,计算密集型的还是使用线程更加合理。 Java 官方并没有协程库。但是伟大的社区提供了一个优秀的库,它就是 Quasar。...那么我们为什么称 Quasar 为协程库呢?

    2.8K31
    领券