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

破解 Kotlin (3) - 调度

关键词:Kotlin 异步编程 上一篇我们知道了启动几种模式,也通过示例认识了 launch 启动使用方法,本文将延续这些内容从调度角度来进一步为大家揭示奥义。 ? 1....上下文 调度器本质上就是一个上下文实现,我们先来介绍下上下文。...首先,所有启动时候,都会有一次 Continuation.resumeWith 操作,这一次操作对于调度器来说就是一次调度机会,我们有机会调度到其他线程关键之处就在于此。...3.4 线程安全问题 Js 和 Native 并发模型与 Jvm 不同,Jvm 暴露了线程 API 给用户,这也使得调度可以由用户更灵活选择。...越多自由,意味着越多代价,我们在 Jvm 上面编写代码时需要明白一点是,线程安全问题调度器不同程之间仍然存在。

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

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

vivo 互联网客户端团队- Ruan Wen 本文是Kotlin解析系列文章开篇,主要介绍Kotlin创建、调度挂起相关内容 一、引入 Kotlin 中引入 Coroutine...“同步方式写出异步代码”这个特性就可以很好解决上述问题。...调度本质就是解决挂起点恢复之后逻辑在哪里运行问题调度器也属于上下文一类,它继承自拦截器。...除了上述方法,kotlin还给出了更简单api,如下: 图片 前述我们是通过线程方式,同理可以通过线程池转为调度器实现。...拦截器实现就是拦截Continuation,可在此处进行缓存、日志打印等拦截处理。 调度器即确认相关协在哪个线程上执行,调度本质是解决挂起恢复后逻辑在哪里运行问题,其继承自拦截器。

1.7K40

Kotlin 底层实现 ② ( 调度器 | 任务泄漏 | 结构化并发 )

文章目录 一、调度器 二、任务泄漏 三、结构化并发 一、调度器 ---- 是在 调度器 中运行 , 在中有 3 种调度器 : Dispatchers.Main 调度器 : 在 主线程...是不同 , 需要采用不同任务取消策略 , 因此这里将耗时任务分配成两种调度器 ; 二、任务泄漏 ---- 任务泄漏 : 发起 任务 后 , 无法追踪任务执行结果 , 任务等于无效任务..., 但是仍然会消耗 内存 , CPU , 网络 , 磁盘 等资源 ; Kotlin 中引入了 结构化并发机制 避免 任务泄漏 情况发生 ; 任务泄漏 与 内存泄漏 类似 ; 三、结构化并发...---- 结构化并发 使用场景 : 任务取消 : 在不需要任务时候 , 取消协任务 ; 追踪任务 : 追踪正在执行任务 ; 发出错误信号 : 如果 任务执行失败 , 发出错误信号..., 表明执行任务出错 ; 任务 运行时 , 必须指定其 CoroutineScope 作用域 , 其会追踪所有的 任务 , CoroutineScope 作用域 可以取消 所有由其启动任务

56120

Kotlin-特殊阻塞

首先是父得到执行,然后才是子。 重点是这两段都在同一个线程main里完成。这里就带来一个有趣问题, runBLocking{}和平时常用launch有什么区别?...这里给出结果,改用GlobalScope.launch之后,子会在一个独立线程里运行。 runBlocking 在kotlin官网上对于这个api解释是桥接阻塞与非阻塞世界。...没有的话就使用默认eventloop。EventLoop是里对阻塞型coroutine进行调度默认调度器。runBlocking和launch主要区别就靠EventLoop实现。...在创建完coroutine后就进入派发流程了,这部分和Kotlin-一个生命周期中逻辑比较相似,下面也会讲到。...猜测是为了避免嵌套太多,导致stack over flow问题出现。

2.3K20

go一个安全调度问题

这是因为 main和 子共享变量造成问题,主要执行流程如下: package main import "time" func main() {    var testNum = 0    ...这就涉及到了go调度问题了,具体是怎么调度呢?...go调度 go调度为 [典藏版] Golang 调度器 GMP 原理与调度全分析 简单说明: G: M:运行线程 P:执行线程处理器,可以理解为cpu中线程/进程 - 在运行时,...,则变成了100%输出 testNum=1: 刚刚我们看到了GMP第一点,有多少个P,就应该有多少个M/G同时运行,那么问题来了,为什么上面的2个没有并行呢?...如果M没有可以执行G后,将会偷其他MG 在示例代码,由于是先执行go func,sleep(2),所以M在执行main开始之后,立即开始执行2,同时由于2 sleep阻塞,所以切回main

65540

破解 Kotlin (5) - 取消篇

关键词:Kotlin 取消 任务停止 任务取消需要靠内部调用协作支持,这就类似于我们线程中断以及对中断状态响应一样。 1. 线程中断 我们先从大家熟悉的话题讲起。...再谈 Retrofit 扩展 4.1 Jake Wharton Adapter 存在问题 我在破解 Kotlin - 入门篇(https://www.bennyhuo.com/2019...,它构造可接受一个 Job 实例作为它,那么问题来了,这里并没有告诉它父究竟是谁,因此也就谈不上作用域事儿了,这好像我们用 GlobalScope.launch 启动了一个一样。...最后我们还分析了一下 Retrofit 扩展一些问题和解决方法,这个例子也进一步可以引发我们对作用域以及如何将现有程序思考。...再稍微提一句,不是一个简单东西,毕竟它原理涉及到对操作系统调度、程序运行机制这样程序界毕竟原始的话题,但你说如果我对前面提到这些都不是很熟悉或者根本没有接触过,是不是就要跟拜拜了呢,其实也不是

1.7K50

Kotlin 上下文和调度器介绍-Dispatchers

介绍 上下文通常是CoroutineContext类型为代表。这个类型是被定义在Kotlin标准库中。 在中,上下文是各种不同元素集合。而其中主导作用元素就是Job。...我们在了解并发与调度时候涉及到了Job。Kotlin 组合挂起函数和async关键字,实现并发操作 (zinyan.com) 这篇继续深入了解Job。...非受限调度器是一种高级机制,可以在某些极端情况下提供帮助而不需要调度以便稍后执行或产生不希望副作用, 因为某些操作必须立即在中执行。非受限调度器不应该在通常代码中使用。...并且这个新Job对象将会成为父子Job对象。 当一个父被取消时候,所有它也会被递归取消。 但是,当使用 GlobalScope 来启动一个时,则新作业没有父作业。...Kotlin 提供了:ThreadLocal,asContextElement 扩展函数来帮助我们,它们创建了额外上下文元素, 且保留给定 ThreadLocal 值,并在每次切换其上下文时恢复它

31310

java框架quasar和kotlin

不同于线程,线程是操作系统级别的资源,创建线程,调度线程,销毁线程都是重量级别的操作。而且线程资源有限,在java中大量不加限制创建线程非常容易将系统搞垮。...,他标记了代码起始和结束位置,以及方法需要暂停位置,每个协任务统一由FiberScheduler去调度,内部维护了一个或多个ForkJoinPool实例。...而反观,基于固定几个线程调度,可以轻松实现百万级处理,而且内存稳稳。 后记 最后,博主以为Quasar只是一个框架层面的东西,所以就又去看了下同样是jvm语言kotlin。...,有种震惊赶脚,kotlin同步模型牛逼呀,瞬时感觉到发现了java里骚操作了,可以使用kotlin来代替java中多线程操作。...io操作,io操作是阻塞并发也就变成了调度几个线程并发了。

33230

Kotlin 学习笔记(四)—— 基础知识,面试官最爱了~

是什么 是一种编程思想。它并不局限于任何语言,不仅 Kotlin 中有对实现,Python、Go 等语言也有。...它设计初衷就是为了解决并发问题,可以更方便地处理多线程协作任务。 在 Kotlin 中,就是一个封装好线程框架。...3.2 调度器 在 3.1 中已经出现过调度身影,就是当需要指定运行线程时,使用调度调度即可。在实际使用中是通过 Dispatchers 对象来访问它们。...立即调度:指的是调度器会立刻接收到调度指令,但具体什么时候调度线程执行,还需要根据调度具体情况而定,即立即调度到立即执行之间通常会有时间间隔。...await 方法后才会开始调度,在执行前如果被取消则将直接进入异常结束状态; ATOMIC:表示该创建后,立即开始调度,且调度和执行合二为一,是原子操作,一定会执行,不会被取消掉,只能忽略执行结果

1.4K30

Kotlin---使用

第一个 在使用程之前,需要保证Kotlin-Gradle-Plugin版本高于1.3。目前最高版本为1.3.11。...并且这样执行,并不会阻塞主线程执行 delay函数只能在中使用,否则编译不过,尽量避免使用GlobalScope.launch创建,当我们使用 GlobalScope.launch 时...如果我们忘记保持对新启动引用,它还会继续运行。 阻塞runBlocking GlobalScope.launch启动了一个线程创建新,并没有阻塞当前线程。...val job = GlobalScope.launch { // 启动一个新并保持对这个作业引用 delay(1000L) println("Hello,......,会等待coroutineScope中都执行完毕后,才会继续执行 挂起函数 当代码超级多时候,通常都会把这些代码提取到一个函数中。

1.2K20

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

在我看来,Kotlin Coroutines() 大大简化了同步和异步代码。...但是,我发现了许多开发者在使用时会犯一些通用性错误。 1. 在使用时实例化一个新 Job 实例 有时候你会需要一个 job 来对进行一些操作,例如,稍后取消。...所以你创建父 job 并不是作用域 job,而是新创建 job 对象。 因此, job 和协作用域 job 此时并没有什么关联。...一些开发者认为当调用时,就应该切换到后台调度器,例如,进行网络请求 Retrofit suspend 函数,进行数据库操作 Room suspend 函数。 这并不是必须。...关于 Kotlin 异常处理最不直观方面之一是,你不能使用 try-catch 来捕获异常。

90420

Kotlin 挂起和恢复 ② ( 挂起 和 线程阻塞 对比 )

文章目录 一、挂起 和 线程阻塞 对比 1、挂起 2、线程阻塞 3、挂起和阻塞对 UI 影响 4、挂起分析 一、挂起 和 线程阻塞 对比 ---- 挂起是概念 , 只能在中使用...; 阻塞是线程中概念 , 可以在主线程和子线程中使用 ; 1、挂起 挂起 操作 : 在中使用 delay 函数 , 挂起 20 秒时间 , 然后 20 秒后更新 UI ; delay...函数是 挂起 suspend 函数 ; // 创建 GlobalScope.launch(Dispatchers.Main) { delay(20000) // 主线程更新 UI... 挂起 操作 不会出现 阻塞 UI 刷新情况 , 挂起 20 秒不影响 UI 刷新显示 ; 但是如果将主线程阻塞 , UI 不再刷新 , 会出现 ANR 崩溃异常 ; 图形化 GUI 系统中..., 会将挂起点状态保存 , 同时停止执行 , 等待挂起函数执行完毕后 , 继续执行 ; 相当于阻塞 , 不会阻塞主线程 ;

1.7K20

Kotlin 挂起和恢复 ① ( 挂起和恢复概念 | suspend 挂起函数 )

文章目录 一、挂起和恢复概念 二、 suspend 挂起函数 一、挂起和恢复概念 ---- 函数 最基本操作 是 : 调用 call : 通过 函数名或函数地址 调用函数 ; 返回...return : 函数执行完毕后 , 继续执行函数调用下一行代码 ; 在 调用 call 和 返回 return 基础上 , 又新增了两种 状态 : 挂起 Suspend : 暂停当前执行..., 在子线程中执行异步任务后 , 会马上执行后续代码 , 只是相当于 普通多线程操作 ; 作用就是 可以 顺序地执行 异步任务 和 主线程任务 , 其执行顺序按照代码顺序执行 ; 挂起 函数..., 只能在 体内部 或者 其它挂起函数 中调用 ; 外部不允许使用挂起函数 ; 在中 , 执行 挂起 Suspend 函数 , 将 挂起点信息 记录下来 , 然后执行耗时操作 , 执行完毕后...){} 中 , 可以直接调用挂起函数 ; 挂起 函数 , 只能在 体内部 或者 其它挂起函数 中调用 ; 外部不允许使用挂起函数 ; 在中 , 执行 挂起 Suspend 函数 , 将 挂起点信息

1.5K40

Kotlin---使用异步

通信 间不能直接通过变量来访问数据,会导致数据原子性问题,所以提供了一套Channel机制来在间传递数据。...所以这里保证所有先前发送出去元素都在通道关闭前被接收到。 基于生产者\消费者 在中,可以通过produce来模拟生产者生产数据。并且通过consume来模拟消费者情况。...它启动了一个单独,这是一个轻量级线程并与其它所有的一起并发工作。...、被限制并封装到该状态以及一个与其它通信 通道 组合而成一个实体。...一个 actor 是一个,而一个是按顺序执行,因此将状态限制到特定可以解决共享可变状态问题。实际上,actor 可以修改自己私有状态,但只能通过消息互相影响(避免任何锁定)。

2.7K20

揭秘kotlinCoroutineContext

前言 -- 从kotlin1.1开始,就被添加到kotlin中作为实验性功能,直到kotlin1.3,kotlinapi已经基本稳定下来了,现在kotlin已经发布到了1.4,为添加了更多功能并进一步完善了它...,所以我们现在在kotlin代码中可以放心引入kotlin并使用它,其实并不是kotlin独有的功能,它是一个广泛概念,协作式多任务实现,除了kotlin外,很多语言如Go、Python等都通过自己方式实现了...实现依赖于线程,它不能脱离线程而存在,因为线程才是CPU调度基本单位,通过程序调度可以执行在一个或多个线程之中,所以需要运行于线程之中,由于是由程序自己调度,所以程序就需要实现调度逻辑...,不同语言调度实现不一样,在kotlin中,通过Dispatcher来调度,而Dispatcher它通常是一个线程池实现或者基于特定平台(例如Android)主线程实现,通过调度运行于一个或多个线程之中...上面就是我对简单理解,总的来说:需要线程承载运行,需要程序自己完成调度让你更容易写出协作式任务。

1.8K30
领券