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

【Kotlin 协程】协程的挂起和恢复 ① ( 协程的挂起和恢复概念 | 协程的 suspend 挂起函数 )

文章目录 一、协程的挂起和恢复概念 二、协程的 suspend 挂起函数 一、协程的挂起和恢复概念 ---- 函数 最基本的操作 是 : 调用 call : 通过 函数名或函数地址 调用函数 ; 返回...return : 函数执行完毕后 , 继续执行函数调用的下一行代码 ; 协程 在 调用 call 和 返回 return 基础上 , 又新增了两种 状态 : 挂起 Suspend : 暂停当前执行的协程..., 只能在 协程体内部 或者 其它挂起函数 中调用 ; 协程外部不允许使用挂起函数 ; 在协程中 , 执行 挂起 Suspend 函数 , 将 挂起点的信息 记录下来 , 然后执行耗时操作 , 执行完毕后...){} 中 , 可以直接调用挂起函数 ; 挂起 函数 , 只能在 协程体内部 或者 其它挂起函数 中调用 ; 协程外部不允许使用挂起函数 ; 在协程中 , 执行 挂起 Suspend 函数 , 将 挂起点的信息..., 异步任务执行完毕后 , 恢复 resume suspend fun asynTask() 函数 , 该函数又回到了 主线程 栈帧 中 , 执行完毕后 , 该函数从 栈帧 中移除 ; ( 此时栈帧内容

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

    Kotlin协程-一个协程的生命周期

    阻塞主线程 2 秒钟来保证 JVM 存活 println("out launch done") } 这里启动了一个常见的coroutine,GlobalScope.launch启动的协程在协程上下文中会派发给底层的线程池去执行...这些代码没有很深的技术,用的都是常见的软件设计思想,梳理这部分逻辑大概用了两天时间,过程中主要需要保持两条清晰的线索,一个是协程的生命周期,一个是生命周期背后支撑的逻辑概念。...创建协程 launch/async 协程的创建有两个常用接口launch和async,两个接口的内部实现基本一致。...此时的coroutine已经拥有了协程上下文,和默认的派发器和调度器。 CoroutineStart是一个枚举类。start干了啥?为什么一个枚举类的值可以直接当函数使用?...所以当最后一个case的时候,返回的是Unit.INSTANCE。此时协程就真正的地执行完毕了。

    99120

    go一个协程安全协程调度的问题

    这是因为 main协程和 子协程共享变量造成的问题,主要执行流程如下: package main import "time" func main() {    var testNum = 0    ...这就涉及到了go的协程调度问题了,具体是怎么调度的呢?...go的协程调度 go的协程调度为 [典藏版] Golang 调度器 GMP 原理与调度全分析 简单说明: G:协程 M:运行的线程 P:执行线程的处理器,可以理解为cpu中的线程/进程 - 在运行时,...GMP的另一个特点: - P可能会有多个M绑定,当M阻塞后,P将绑定其他M进行执行 - M会有多个G绑定,当一个G阻塞后,将获取一个新的G进行运行 - 如果M的G已经超出数量后,将会分一半给其他的M -...如果M没有可以执行的G后,将会偷其他M的G 在示例代码,由于是先执行的go func,sleep(协程2),所以M在执行main开始之后,立即开始执行协程2,同时由于协程2 sleep阻塞,所以切回main

    68740

    【Kotlin 协程】协程取消 ③ ( finally 释放协程资源 | 使用 use 函数执行 Closeable 对象释放资源操作 | 构造无法取消的协程任务 | 构造超时取消的协程任务 )

    函数构造超时取消的协程任务 一、释放协程资源 ---- 如果 协程中途取消 , 期间需要 释放协程占有的资源 ; 如果执行的协程任务中 , 需要 执行 关闭文件 , 输入输出流 等操作 , 推荐使用...挂起函数以及之后的代码将不会被执行 ; 使用 withContext(NonCancellable) {} 代码块 , 可以构造一个无法取消的协程任务 , 这样可以避免 finally 中的代码无法完全执行...23:12:32.093 I 退出协程作用域 四、使用 withTimeoutOrNull 函数构造超时取消的协程任务 ---- 使用 withTimeout 函数 , 可以构造超时取消的协程任务...返回一个 返回值 , 则使用 withTimeoutOrNull 函数进行构造 , 如果顺利执行 , 则按照正常返回值返回 , 如果执行超时 , 则直接返回 null ; 代码示例 : package...:34:36.794 I 上述协程任务的返回值为 null

    1.4K10

    爬虫中如何解决异步协程函数调用遇到的问题

    本文将介绍在微信公众号爬取中使用异步协程函数时可能遇到的问题,以及如何解决这些问题。问题描述微信公众号爬取的目标是获取公众号文章、评论等数据。...解决方案为了解决在微信公众号爬取中使用异步协程函数的问题,我们提供以下两种解决方案:3.1 将异步协程函数封装成一个库在这个方案中,我们将异步协程函数封装成一个独立的库或模块,允许我们在微信公众号爬取项目中引入并使用它...以下是具体的实现步骤:创建一个自定义库或模块,封装异步协程函数。在库或模块中,我们需要处理异步事件循环的创建和管理,以确保异步协程函数能够正常运行。在微信公众号爬取项目中引入并使用该库或模块。...3.2 将异步协程函数转换为同步函数如果你不想使用中间件来处理异步操作,还可以将异步协程函数转换为同步函数,然后在需要使用异步协程函数的地方,调用这些同步函数。...以下是具体的实现步骤:创建一个同步函数async_to_sync,该函数接受异步协程函数作为参数,并将其转换为同步函数。

    28530

    如何优雅的处理协程的异常?

    first 如何优雅的处理协程的取消?...在这篇文章中,我会介绍在协程中异常是怎么传播的,以及如何使用各种方式控制异常的传播。...当一个协程发生了异常,它将把异常传播给它的父协程,父协程会做以下几件事: 取消其他子协程 取消自己 将异常传播给自己的父协程 异常最终将传播至继承结构的根部。...它们都会创建一个子作用域(以 Job 或者 SupervisorJob 作为 Parent),来帮助你给协程从逻辑上分组(如果你想进行并行计算,或者它们是否会相互影响)。...因为在这种情况下,每个新的协程总是被分配一个新的 Job,这个新的 Job 覆盖了 SupervisorJob 。SupervisorJob 是父协程通过 scope.launch 创建的。

    1.1K30

    协程的简单操作,你都知道哪些?Golang如何实现协程交替打印?

    前言 对于并发的概念,我们都清楚为了合理利用CPU的执行效率,我们选择当一个事务或多个事务执行时交替执行对于当下的计算机执行是很快的并且是对用户无感的,所以我们往往采用极少的资源执行更多事情。...假设目前需要执行两个协程,一个协程来执行字母,一个协程执行数字,让两个协程进行交替打印如何实现?又或者如何使用大量的多个协程来交替的执行从一数到五万这样的大任务呢?...公共变量 对于下方的WaitGroup方法可以参考我之前写过的一篇文章:【并发编程】WaitGroup 基本用法和如何实现以及常见错误 之后加入一个关键信号量(boolean)来控制同步问题,当然你也可以使用...wg := sync.WaitGroup{} wg.Add(2) boolean := true num, str := 1, 'A' // 协程块 // ...... wg.Wait() 协程打印数字...num) num++ fmt.Print(num) num++ boolean = false } if num > 28 { break } } }() 协程打印字母

    60810

    【Kotlin 协程】Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 协程中调用挂起函数返回集合 )

    文章目录 一、以异步返回返回多个返回值 二、同步调用返回多个值的弊端 三、尝试在 sequence 中调用挂起函数返回多个返回值 四、协程中调用挂起函数返回集合 一、以异步返回返回多个返回值 ----...在 Kotlin 协程 Coroutine 中 , 使用 suspend 挂起函数 以异步的方式 返回单个返回值肯定可以实现 , 参考 【Kotlin 协程】协程的挂起和恢复 ① ( 协程的挂起和恢复概念...| 协程的 suspend 挂起函数 ) 博客 ; 如果要 以异步的方式 返回多个元素的返回值 , 可以使用如下方案 : 集合 序列 Suspend 挂起函数 Flow 异步流 二、同步调用返回多个值的弊端...can only invoke member or extension suspending functions on their restricted coroutine scope 受限挂起函数只能在其受限的协程范围上调用成员或扩展挂起函数...---- 如果要 以异步方式 返回多个返回值 , 可以在协程中调用挂起函数返回集合 , 但是该方案只能一次性返回多个返回值 , 不能持续不断的 先后 返回 多个 返回值 ; 代码示例 : package

    8.3K30

    【说站】await在python协程函数的使用

    await在python协程函数的使用 说明 1、await是一个只能在协程函数中使用的关键词,用于在遇到IO操作时悬挂当前协程(任务). 2、在悬挂当前协程(任务)的过程中,事件循环可以执行其他协程...(任务),在当前协程IO处理完成后,可以重新切换执行后的代码。...使用方法 await + 可等待对象(协程对象、Future对象、Task对象) 实例 import asyncio async def func():     print("执行协程函数内部代码")...# 当前协程挂起时,事件循环可以去执行其他协程(任务)。     ...asyncio.sleep(2)     print("IO请求结束,结果为:", response) result = func() asyncio.run(result) 以上就是await在python协程函数的使用

    77540

    【Kotlin 协程】Flow 异步流 ⑥ ( 调用 Flow#launchIn 函数指定流收集协程 | 通过取消流收集所在的协程取消流 )

    文章目录 一、调用 Flow#launchIn 函数指定流收集协程 1、指定流收集协程 2、Flow#launchIn 函数原型 3、代码示例 二、通过取消流收集所在的协程取消流 一、调用 Flow...#launchIn 函数指定流收集协程 ---- 1、指定流收集协程 响应式编程 , 是 基于事件驱动 的 , 在 Flow 流中会产生源源不断的事件 , 就是 发射元素操作 ; 拿到 Flow 流后..., 开始 收集元素 , 按照顺序逐个处理产生的事件 ( 元素 ) ; 调用 Flow#launchIn 函数 , 传入 协程作用域 作为参数 , 可以 指定 收集 Flow 流元素 的 协程 ; 在上一篇博客...【Kotlin 协程】Flow 异步流 ⑤ 中 , 调用 Flow#flowOn 函数 , 可以 指定 Flow 流发射元素 的 协程 ; Flow#launchIn 函数返回值是 Job 对象 ,...(2000) 创建一个协程 , 该协程在 2000ms 后自动超时取消 , 同时在其中进行 流收集 的操作也一并取消 ; package kim.hsl.coroutine import android.os.Bundle

    85820

    【Kotlin 协程】协程中的多路复用技术 ② ( select 函数原型 | SelectClauseN 事件 | 查看挂起函数是否支持 select )

    一、select 函数原型 ---- 在上一篇博客 【Kotlin 协程】协程中的多路复用技术 ① ( 多路复用技术 | await 协程多路复用 | Channel 通道多路复用 ) 中 , 介绍了...协程多路复用技术 , 多路复用 主要使用 select 代码块 实现 , 在 select 代码块中 调用多个协程的 onAwait 函数 , 哪个协程先返回数据 , 就选择该协程的数据作为返回值 ;...如果有任何子句_fails_,则选择调用将生成 * 相应的异常。在本例中没有选择子句。 * * 这个选择函数是_biased_到第一个子句。当可以同时选择多个子句时, * 第一个有优先权。...相反,每个可选择的挂起函数都具有 * 对应的非挂起版本,可以与常规的“when”表达式一起使用来选择一个 * 的选项,如果没有选项可以立即选择,则执行默认(' else ')操作。...如果当前协程的[Job]被取消或完成 * 函数挂起后,该函数立即恢复[CancellationException]。 * 有**立即取消保证**。

    1.2K20

    OCaml中的并行编程:从线程到协程

    子进程的优点是可以充分利用多核处理器的性能,但是缺点是需要处理进程间通信和同步的问题,以及可能消耗更多的资源和开销。协程在OCaml 5.0.0中,OCaml引入了一个新的多线程库,称为Fiber。...该库旨在提供高性能和低开销的轻量级协程,以便在多线程环境中执行并发任务。Fiber使用用户级线程,因此不会受到GIL的限制。Fiber还支持结构化并发和错误处理等特性。...协程的优点是可以在同一个线程中切换执行上下文,而不需要涉及操作系统或内核级别的调度,从而提高性能和可控性。但是缺点是需要使用特定的API来创建和管理协程,以及可能遇到死锁或饥饿等问题。...下面使用Fiber和爬虫代理IP进行百度访问:open Fiber.O(* 定义一个函数,用于创建一个HTTP客户端 *)let create_client () = let open Cohttp_lwt_unix...*) Body.to_string body(* 定义一个函数,用于创建多个Fiber,并等待它们的结果 *)let run_fibers n = (* 创建一个列表,包含n个Fiber *)

    1.3K20

    精通协程的必会十一个高级技巧

    () // 释放信号 } } } 在上面的示例中,我们创建了一个 Semaphore,允许同时运行的协程数量为3。...("Child job 2 failed") } } parentJob.join() } 在上面的示例中,我们创建了一个 SupervisorJob 作为父协程的...协程的扩展函数 原理 扩展函数是定义在顶层的函数,它们采用接收者类型(通常是类类型)作为参数,允许您在不修改原始类的情况下添加新的函数。在协程中,您可以通过扩展函数为协程相关的类和接口添加额外的操作。...具体使用 以下是一个示例,演示如何编写协程扩展函数: fun Job.myOnCancellation(callback: () -> Unit) { this.invokeOnCancellation...具体使用 以下是一个示例,演示如何使用 runBlockingTest 函数来测试协程中的网络请求操作: import kotlinx.coroutines.* import kotlinx.coroutines.test.runBlockingTest

    34640

    【Kotlin 协程】协程异常处理 ⑤ ( 异常传播的特殊情况 | 取消子协程示例 | 子协程抛出异常后父协程处理异常时机示例 | 异常聚合 | 多个子协程抛出的异常会聚合到第一个异常中 )

    文章目录 一、异常传播的特殊情况 1、取消子协程示例 2、子协程抛出异常后父协程处理异常时机示例 二、异常聚合 ( 多个子协程抛出的异常会聚合到第一个异常中 ) 一、异常传播的特殊情况 ---- 在...; ③ 向父协程的父协程传播异常 : 继续将异常传播给 父协程的父协程 ; 但是也有特殊情况 : 协程 调用 Job#cancel() 函数 进行取消操作时 , 会 抛出 CancellationException...使用 launch 协程构建器 创建了子协程 , 注意 如果想要子协程运行 , 必须在创建完子协程后 调用 yield() 函数 , 让 父协程 让渡线程执行权 , 也就是令 子协程 执行起来 , 否则...二、异常聚合 ( 多个子协程抛出的异常会聚合到第一个异常中 ) ---- 父协程 中 有多个 子协程 , 这些子协程 都 抛出了 异常 , 此时 只会处理 第一个 异常 ; 这是因为 多个 子协程..., 如果出现了多个异常 , 从第二个异常开始 , 都会将异常绑定到第一个异常上面 ; 在 CoroutineExceptionHandler 中 , 调用 throwable.suppressed.contentToString

    75710

    如何控制golang协程的并发数量问题

    问题 最近搞压测,写了一个压测的工具,就是想通过go来实现一秒发多少个请求,然后我写了一段这样的代码,如下,当然压测的代码我就没有贴了,我贴了主要核心代码,主要是起一个定时器,然后通过但仅此去读定时器的通道...解决方案 1:不同的应用程序,消耗的资源是不一样的。比较推荐的方式的是:应用程序来主动限制并发的协程数量。 关于上面的问题代码我们进行优化,通过channel来控制并发数。...make(chan struct{}, 300) 创建缓冲区大小为 300 的 channel,在没有被接收的情况下,至多发送 300 个消息则被阻塞。...开启协程前,调用 ch <- struct{}{},若缓存区满,则阻塞。 协程任务结束,调用 协程并发控制的目的。

    2.2K40

    近期的一个协程流程BUG

    关于创业失败 2016年最大的一个事件应该算是创业失败吧,所以从之前的公司退出了。这两年的努力和经历让人感触良多,虽然是失败了,也不算是一无所得吧。接触到了如果呆在腾讯,永远也不可能接触到的东西。...当然过程中避免不了会碰到一些细节问题,但是修复以后这就是一个经过项目验证并且可维护性和性能都高于腾讯TSF4G的解决方案。当然TSF4G的人力和比较元老导致其周边设施高的多。...对比看了下C++里也出现了promise/future,感觉这个方案虽然不如协程直观,但是确实比协程坑少并且严谨,是个挺有意思的思路。目前没想到C++里怎么用它编程模式比较好。...等到这套东东更完善了而且我想到了怎么用比较好,说不定atsf4g-co的sample solution会换一种RPC的设计模式,不再用协程。 还有一些小东西也不是很记得了,先这样吧。...写在最后 这一年的变化还是很大的,现在帮同学搞游戏服务端,我的另一个私心就是正式上线自己的游戏框架。所以,2017年加油!!!

    23060

    近期的一个协程流程BUG

    其实严格来说这个BUG更应该是一个流程试用问题,不过这个问题应该是需要能在协程库里检测并抛出错误来。...执行流程 首先是正常的执行流程。 外部->协程A(yield)[->外部(resume)->协程A(yield)]…->外部 这时候,首次切入的时候,由首次的回调函数保存上下文。...其次是一个协程启动另一个协程,然后yield回前一个,走类似链式的流程,也是类似栈的流程。...其实我还考虑过,协程的caller保存协程指针而不只是上下文。但是这样也是有问题的,一个是数据保存的流程和生命周期很难管理,其次是碰到复杂的调用流程的话,还是没法通知某些协程通知caller。...解决方案 所以最终最安全的解决方案还是加个flag禁止掉这种调用。即一旦一个协程被切入了,只能通过yield切出。而同理,没有被切入的协程,必须通过start/resume切入。

    36920

    如何正确的在 Android 上使用协程 ?

    在 Android 中,一般是不建议直接使用 GlobalScope 的。那么,在 Android 中应该如何正确使用协程呢?再细分一点,如何直接在 Activity 中使用呢?...如何配合 ViewModel 、LiveData 、LifeCycle 等使用呢?我会通过简单的示例代码来阐述 Android 上的协程使用,你也可以跟着动手敲一敲。...直接使用 GlobalScope 的 async 或者 launch 方法是强烈不建议的。 GlobalScope 创建的协程没有父协程,GlobalScope 通常也不与任何生命周期组件绑定。...() {} 通过扩展函数 launch() 可以直接在主线程中启动协程,示例代码如下: private fun launchFromMainScope() { launch {...那么如何在 ViewModel 中定义协程作用域呢?还记得上面 MainScope() 的定义吗?没错,搬过来直接使用就可以了。

    2.8K30
    领券