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

Kotlin的协程及Android的应用

,所以runBlocking函数我们开发基本不会使用到,但可以用于代码调试。...).launch { } 和 GlobalScope.launch(Dispatchers.IO){ } 这两种方式都是指定的 IO 调度启动一个协程,但它们之间有一些区别: GlobalScope.launch...比如:网络请求,数据库操作,文件操作等 Main:UI调度器,只有UI编程平台上有意义,用于更新UI,例如Android的主线程 Unconfined:非受限调度器,无所谓调度器,当前协程可以运行在任意线程上...最常见的,网络请求IO线程,而页面更新线程。 Kotlin给我们提供了一个顶层函数withContext用于改变协程的上下文并执行一段代码。...挂起函数的特点是“挂起与恢复”,协程遇到挂起函数,协程会被挂起,等挂起函数执行完毕以后,协程会恢复到挂起的地方重新运行

14310

使用kotlin协程提高app性能(译)

在上面的示例,get()仍然线程运行,但它在启动网络请求之前挂起协同程序。网络请求完成,get恢复暂停的协程,而不是使用回调来通知主线程。...要在主线程之外运行代码,您可以告诉Kotlin协程Default或IO调度程序上执行工作。Kotlin,所有协同程序必须在调度程序运行,即使它们线程运行。...放在该块的任何代码总是通过IO调度程序执行。 由于withContext本身是一个挂起函数,因此函数get也是一个挂起函数。 使用协同程序,您可以调度具有细粒度控制的线程。...您需要安全,例如在读取或写入磁盘,执行网络操作或运行CPU密集型操作,应始终挂起函数内使用withContext()。...这些丢弃的异常不会出现在崩溃指标,也不会出现在logcat。 并行分解 函数返回,必须停止由挂起函数启动的所有协同程序,因此您可能需要保证这些协程返回之前完成

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

Go语言之goroutine和通道

不同的是:Golangruntime,系统调用等多方面对goroutine调度进行了封装和处理,即goroutine不完全是用户控制,一定程度上由go运行时(runtime)管理,好处:某goroutine...这个函数暂停当前正在运行线程,把他的寄存器信息保存到内存,查看线程列表并决定接下来运行哪一个线程,再从内存恢复线程的注册表信息,最后继续执行选中的线程。...从调度上讲,线程调度由 OS 的内核完成线程的切换需要CPU寄存器和内存的数据交换,在线程切换的过程需要保存/恢复所有的寄存器信息,比如16个通用寄存器,PC(Program Counter),SP...而goroutine 的调度 则比较轻量级,由go自身的调度完成;Go运行的时候包涵一个自己的调度器,这个调度器使用一个称为一个M:N调度技术,m个goroutine到n个os线程(可以用GOMAXPROCS...一个值无缓冲通道上传递,接收值后发送方goroutine才被再次唤醒。

60420

《快学 Go 语言》第 11 课 —— 千军万马跑协程

上面的代码协程睡眠了 1s,等待子协程们执行完毕。...n 的值可以发现一个有趣的现象, n 值大于 3 协程将没有机会得到运行,而如果 n 值为 3、2、1,协程依然可以每秒输出一次。...一个协程睡眠,它要将线程运行权让给其它的协程来运行,而不能持续霸占这个线程。同一个线程内部最多只会有一个协程正在运行。 ?...同一个线程中最多只会存在一个处于运行态的协程,就绪态的协程是指那些具备了运行能力但是还没有得到运行机会的协程,它们随时会被调度运行态,休眠态的协程还不具备运行能力,它们是等待某些条件的发生,比如 IO...在这个请求处理过程,要进行很多 IO 调用,比如访问数据库、访问缓存、调用外部系统等,协程会休眠,IO 处理完成后协程又会再次被调度运行

87820

干货 | 携程基于Quasar协程的NIO实践

协程调用的方法是可以挂起的。不同于线程的阻塞会使线程休眠,协程等待异步任务的结果,会通知调度器将自己放入挂起队列,释放占用的线程以处理其他的协程。...Quasar框架AsyncCompletionStage.get内部完成的工作相当于,HttpClient返回的future上注册回调,回调的内容是“IO操作完成后通知调度器唤醒协程”,这样将NIO异步回调全部操作封装在协程调度...synchronized同步块的内部,不能包含挂起协程的语句。持有锁的协程挂起后会让出线程资源,由于锁的可重入性,另一个运行在同一个线程上的协程再加锁同样会成功。...线程执行过程可能切换,而协程的调度每个执行线程上是串行的,协程持有的锁在不包含挂起操作,会在占用线程执行完毕直到退出同步块为止,不会发生锁失效的情况。...运行时空指针、死循环的症状,排查的重点是是否漏加SuspendExecution标记。 线程而不是新协程中使用挂起方法,会出现同样的问题。

1.6K30

Go 语言调度(一): 系统调度

系统调度器负责保证线程可以执行时,CPU 是不能处于空闲状态的。它还必须创建一个所有线程同时都在运行的假象。创造这个假象的过程调度器需要优先运行优先级更高的线程。...越多的就绪态线程意味着每个线程会得到越少的时间,也就意味着同一间你能完成的工作越少(其他的 CPU 时间都被操作系统拿去做调度用了)。...使用线程池来调整服务的性能,找到一个正确的一致配置是很复杂的。 Cache Line 访问内存的数据是有很高延迟的。大约 100 ~ 300 个时钟周期。...其他核上的线程试图访问或修改这个数据,需要重新从内存上拷贝最新的数据到自己的 cache 。 也许 2 核的 CPU,不会出大问题,但如果是 32 核的 CPU 并行的运行着 32 个线程呢?...但是新线程会立刻开始执行,主线程也能继续完成自己的工作。 用哪种方式呢?这就是系统调度在做调度决策需要考虑的一个有趣的问题。答案是,如果有空闲的核,那就直接用。

1.3K50

Goroutine和Channel的的使用和一些坑以及案例分析

软件运行的最小单位是进程,一个软件或者应用程序启动我们知道操作系统为其创建了一个进程;代码运行的最小单位是线程,我们平时编程写的代码片段程序跑起来后一定是一个线程运行的,而这个线程是属于这个进程创建的...,其本质是内核线程和用户态线程成了多对多的关系 Goroutine和Channel的使用 如下代码运行起来,Go的协程就启动起来了 package main func main(){ fmt.Println...,那就是通过channel通道来实现,channel创建可以指定是否带有缓冲区,如果不带缓冲区,那么一个协程往通道写入一个数据的时候,另一个协程必须读取,否则第一个协程就只能出去阻塞状态(也就是生产一个...通道被两个协程操作,如果一方因为阻塞导致另一放阻塞则会发生死锁,如下代码创建两个通道,开启两个协程(协程和子协程),协程从c2读取数据,子协程往c1,c2写入数据,因为c1,c2都是无缓冲通道,...它类似于switch语句,但是它的case涉及到channel有关的I/O操作,或者换一种说法,select就是用来监听和channel有关的IO操作, IO 操作发生,触发相应的动作,基本用法如下

1.4K30

Android面试题之Kotlin 协程的挂起、执行和恢复过程

取消状态:协程是否被取消或处于取消状态。 2. 状态与上下文的保存形式 2.1 协程堆栈帧 协程挂起,会将当前的堆栈帧转换为对象并存储。...协程挂起后切换到其他线程执行 协程遇到挂起点(如 delay, await 等 suspend 函数),它会触发挂起机制,具体步骤如下: 3.1 挂起点的处理 协程挂起点被挂起,当前函数状态和局部变量会被保存到...协程在其他线程执行完后的通知机制 5.1 异步任务完成通知 协程新的线程执行完任务(比如完成网络请求等异步任务),执行环境会调用 Continuation 的 resumeWith 方法: continuation.resumeWith...6.2 分配线程 调度器找到或分配合适的线程,根据协程上下文完成恢复调度。典型的调度器如 Dispatchers.Main 或自定义调度器负责将任务放回特定线程运行。...) 确保代码一开始运行在主线程

9910

MongoDB transport_layer网络传输层模块源码实现四

service_executor线程模型子模块,代码实现,把线程模型分为两种:synchronous线程模式和adaptive线程模型,这两种线程模型中用于任务调度运行线程统称为worker工作线程...退出的线程生命期内运行的总时间(包括等待IO运行IO任务的时间) _localThreadState 完成线程级的统计 _totalQueued 总的入队任务数 _totalExecuted...工作线程while体每循环一次都会判断当前线程是否很”闲”,如果很”闲”则本线程直接销毁退出。...3.1.3 controller控制线程核心代码实现 控制线程用于判断线程池是线程是否压力很大,是否比较”忙”,如果是则增加线程数来减轻全局队列task任务积压引起的延迟处理问题。...Mongodb启动初始化的时候,会创建一个线程名为”worker-controller”的控制线程,该线程主要工作就是判断线程池中是否有充足的工作线程来处理asio库全局队列op_queue_

57620

Golang - 调度剖析【第一部分】

不过本篇文章,多线程 Go 程序设计和实现上是否调度器的工作原理完全契合不是重点。重要的是对系统调度器和 Go 调度器,它们是如何正确地设计多线程程序,有一个全面且深入的理解。...+0x39PC 偏移量表示程序没中断的情况下,线程即将执行的下一条指令。如果控制权回到函数,则函数的下一条指令是0+x72PC 偏移量。更重要的是,指针前面的指令是当前正在执行的指令。...调度器将一个正在执行的线程从内核取出并将其更改状态为一个可运行线程,就会发生上下文切换。 上下文切换的代价是高昂的,因为核心上交换线程会花费很多时间。...你可以控制应用程序中使用的线程数量。有更多的线程要考虑,并且发生 IO-Bound 工作,就会出现一些混乱和不确定的行为。任务需要更长的时间来调度和执行。 这就是为什么游戏规则是“少即是多”。...这就是为什么多线程应用程序内存的变化会造成性能噩梦。 并行运行的多个线程正在访问相同的数据值,甚至是相邻的数据值,它们将访问同一cache line上的数据。

51220

Python定时框架 Apscheduler 详解

scheduler循环(main_loop),反复检查是否有需要执行的任务,完成任务的检查函数为 _process_jobs,主要有那个几个步骤: 1、询问储存的每个 jobStore,是否有到期要执行的任务...调度器(scheduler): 负责将上面几个组件联系在一起,一般应用只有一个调度器,程序开发者不会直接操作触发器、作业存储或执行器,而是利用调度器提供了处理这些合适的接口,作业存储和执行器的配置都是通过调度完成的...---- 我们的使用过程,选择合适的调度器是根据我们的开发环境以及实际应用来决定的,根据IO模型的不同,主要有下面一些常见的调度器: BlockingScheduler:适合于只进程运行单个任务的情况...max_instance:每个job同一刻能够运行的最大实例数,默认情况下为1个,可以指定为更大值,这样即使上个job还没运行完同一个job又被调度的话也能够再开一个线程执行。...misfire_grace_time:单位为秒,假设有这么一种情况,某一job被调度刚好线程池都被占满,调度器会选择将该job排队不运行,misfiregracetime参数则是在线程池有可用线程时会比对该

1.8K20

万字长文带你深入理解协程|业界设计和实现的决策分析

第1节.旧时代 2014年以前,C++服务端开发是以异步回调模型为主流,业务流程每一个需要等待IO处理的节点都需要切断业务处理流程、保存当前处理的上下文、设置回调函数,等IO处理完成后再恢复上下文、...为了IO方面降低线程竞争,libgo会为每个调度线程必要的时候单独创建一个epoll; 关于每个epoll的使用,会在后面的本章第4节.HOOK-网络io展开详细论述;其他关于多线程的设计会贯穿全文的逐个介绍...但是这段代码执行于libco的协程,被hook后的结果isNonBlock居然是true!...阻塞操作(read/write/poll/select)无法立即完成,那么协程会被设置为io-block状态并保存到io-wait队列,将期协程的sentry保存在socket的等待队列,然后将这一个或多个...也可以使用 等待bar在线程池中完成,并将bar的返回值写入变量a。co_await也同样可以协程之外被调用。

50510

JVM之内存模型与线程

程序在运行过程,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算就可以直接从它的高速缓存读取数据和向其中写入数据,运算结束之后,再将高速缓存的数据刷新到主存当中。...(多核CPU,每条线程可能运行于不同的CPU,因此每个线程运行时有自己的高速缓存(对单核CPU来说,其实也会出现这种问题,只不过是以线程调度的形式来分别执行的)。本文我们以多核CPU为例。)...通过缓存一致性协议 核心的思想是:CPU写数据,如果发现操作的变量是共享变量,即在其他CPU也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此其他CPU需要读取这个变量...B中使用配置信息的代码就可能出现错误,而volatile关键字则可以避免此类情况的发生; volatile的特殊规则: - 要求工作内存,每次使用volatile型变量,必须先从内存刷新最新的值...A 先行发生于 操作C的结论; Java与线程 线程的实现 线程是比进程更轻量级的调度执行单位: 线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址,文件IO等),

22410

JavaScript执行机制

以下几种任务都属于宏任务:代码块setTimeoutsetInterval各种IO任务,包括网络IOsetImmediate(NodeJS)微任务:又称job(ES标准,称之为Microtasks)...这些都在 任务队列(task queue)上被调度以下时机,任务会被添加到任务队列:一段新程序或子程序被直接执行时(比如从一个控制台,或在一个元素运行代码)。...微任务和宏任务有两个重要的区别:首先,每当一个任务存在,事件循环都会检查该任务是否正把控制权交给其他 JavaScript 代码。如若不然,事件循环就会运行微任务队列的所有微任务。...注意PromiseExecutor不属于异步任务,而是属于同步任务,代码块执行时一并顺序执行,而Promise.then则是执行过程中产生的微任务,会被事件处理线程注册到微任务的Event Table...该队列已用尽或达到回调限制,事件循环将移动到下一阶段,等等。由于这些操作的任何一个都可能调度 更多的 操作和由内核排列轮询阶段被处理的新事件, 且处理轮询的事件,轮询事件可以排队。

33322

从Golang调度器的作者视角探究其设计之道!

golang里也可以如此,不能让一些goroutine长期霸占着运行资源不退出,必须实现基于时间片的“抢占”。 那怎么抢占呢,需要监测goroutine执行时间片是否用完了。...线程A从系统调用返回,不会继续执行,而是将G放到run queue,然后进入idle状态等待唤醒,这样一来便能确保活跃线程数依然与Processor数量相同。...协程主控循环tick直接管理协程,协程调度不涉及background thread 网络IO、第三方异步API tick驱动、timer管理、协程创建销毁管理等都是协程在做。...主控循环中,如果要创建或恢复协程,就任由它去立即执行,一直跑到它阻塞挂起再返回协程。 协程切换示意图,图注:1、2、5协程,3、4在业务协程,协程和业务协程都在主线程内。...对于一些第三方异步API,如果其tick本身实现不好,导致大量占据了运行时间,也可以分拆线程,然后用队列之类的机制和主线程协程交互即可。 对于网络IO也同上。

31540

Go 语言并发编程系列(二)—— Go 协程实现原理和使用示例

Go 并发编程原理 Go 语言的协程实现被称之为 goroutine,由 Go 运行时管理, Go 语言中通过协程实现并发编程非常简单:我们可以一个处理进程通过关键字 go 启用多个协程,然后不同的协程完成不同的子任务...,这些用户代码创建和维护的协程本质上是用户级线程,Go 语言运行时会在底层通过调度器将用户级线程交给操作系统的系统级线程去处理,如果在运行过程遇到某个 IO 操作而暂停运行调度器会将用户级线程和系统级线程分离...,以便让系统级线程去处理其他用户级线程,而 IO 操作完成,需要恢复运行调度器又会调度空闲的系统级线程来处理这个用户级线程,从而达到并发处理多个协程的目的。...协程启动子协程后,程序就退出运行了,这就意味着包含这两个协程的处理进程退出了,所以,我们运行这段代码,不会看到子协程里运行的打印结果,因为还没来得及执行它们,进程就已经退出了。...这种方式就不合适了,我们需要一种更精准的方式子协程执行完毕后,立即退出协程,这就涉及到协程间的通信,我们将在下一篇教程重点讨论这一块,并且通过协程间通信来重写这段代码

2.5K20

go面试题目收集

协程和线程一样共享堆,不共享栈,协程由程序员协程的代码里显示调度。...IO 操作发生,触发相应的动作 每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作 协程如何等其余协程完再操作 使用channel进行通信,完成同步功能,context...但是线程太多时,写线程一直被阻塞显然是不对的,所以一个线程想要对其进行写加锁,就会阻塞读加锁,先让写加锁线程加锁 自旋锁 自旋锁和互斥锁很像,唯一不同的是自旋锁访问加锁资源,会一直循环的查看是否释放锁...乐观锁 这其实是一种思想,线程去拿数据的时候,认为别的线程不会修改数据,就不上锁,但是更新数据的时候会去判断以下其他线程是否修改了数据。...任何时间都可以用无缓冲的通道来让两个 goroutine 交换数据,通道操作完成一定保证对方接收到了数据。

59152

Kotlin 协程和 Android SQLite API 线程模型

这个查询另外一个线程中被执行时,那它就不再属于这个事务的一部分了,这样的话就会导致这个查询被阻塞,直到事务另外一个线程执行完成。...数据库的事务操作都是一个线程完成的,这样的 API 不会有任何问题,但是使用协程之后问题就来了,因为协程是不绑定在任何特定的线程上的。...事务开始,Room 会获得 executor 某个线程的控制权,直到事务结束。事务执行期间,即使调度器因子协程发生了变化,已执行的数据库操作仍会被分配到该事务线程上。 ...我们的例子,这个值是没有意义的, Room 也只需要确定这个值是否存在即可。...Room 的阻塞函数,包含 DAO 生成的那些,它们被事务协程调用后会被特殊处理,用来保证它们不会在其他的调度器上运行

1.8K20

浅谈:Golang 并发

进程与线程 概念 面向进程设计的系统,进程(process)是程序的基本执行实体;在当代面向线程设计的计算机结构,进程是线程的容器。 进程是程序(指令和数据)的真正运行实例。...【内核线程】【轻量级进程】【用户线程】 ? 在用户空间模拟操作系统对进程的调度,来调用一个进程线程,每个进程中都会有一个运行时系统,用来调度线程。...此时该进程获取cpu,进程内再调度出一个线程去执行,同一刻只有一个线程执行。 ? 内核级线程:切换由内核控制,线程进行切换的时候,由用户态转化为内核态。切换完毕要从内核态返回用户态。 ?...运行态:这表示线程已经被分配了一个 CPU 核,正在执行它的指令。与应用相关的工作正在被完成。这是每个人都想要的状态。 CPU密集型任务和IO密集型任务 CPU密集处理任务中线程很少进入阻塞态。...cache line 拷贝都标记为“不可用”,其他核上的线程试图访问或修改这个数据,需要重新从内存上拷贝最新的数据到自己的 cache

72010

《Go 语言零基础入门到项目实战》

程序运行结束后,再把进程销毁,然后运行下一个程序,周而复始。 进程程序运行是非常占用资源的,无论是否会用到全部的资源,只要程序启动了,就会被加载到进程。...一个进程总会有一个主线程,类似地,每一个独立的 Go 程序在运行时也总会有一个 goroutine。这个 goroutine 会在 Go 程序的运行准备工作完成后被自动地启用。...如下图所示,程序执行到一条 Go 语句,Go 语言的运行时系统会先试图从某个空闲的 G 队列获取一个 G(也就是 goroutine),只有找不到空闲 G 的情况下它才会去创建一个新的 G。...一旦 goroutine 代码(也就是 main 函数的那些代码)执行完毕,当前的 Go 程序就会结束运行 Go 程序结束运行时,无论其他的 goroutine 是否运行,都不会被执行了。... for 语句的最后一个迭代运行时,其中的那条 Go 语句即最后一条语句。所以,执行完这条 Go 语句之后, goroutine 代码就执行完了,Go 程序会立即结束运行

73930

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券