协程的async使用
async与launch一样都是开启一个协程,但是async会返回一个Deferred对象,该Deferred也是一个job
async函数类似于 launch函数.它启动了一个单独的协程,这是一个轻量级的线程并与其它所有的协程一起并发的工作.不同之处在于 launch 返回一个 Job 并且不附带任何结果值,而 async 返回一个 Deferred —— 一个轻量级的非阻塞 future,这代表了一个将会在稍后提供结果的 promise.你可以使用 .await() 在一个延期的值上得到它的最终结果, 但是 Deferred 也是一个 Job
看一下async的使用:
GlobalScope.launch {
var deffer1 = async(Dispatchers.IO) {
async1()
}.await()
var deffer2 = async(Dispatchers.IO) {
async2()
}.await()
val result = deffer1 + deffer2
println("the sum is: $result")
}
private suspend fun async1(): Int {
delay(1500)
println("async1")
return 1
}
private suspend fun async2(): Int {
delay(300)
println("async2")
return 2
}
最终输出:
I/System.out: async1
I/System.out: async2
I/System.out: the sum is: 3
async1先执行,说明其是顺序进行的,因为await本身就是一个挂起行数,这时候它的用法与withContext没有什么差别。
再看一个例子:
GlobalScope.launch {
var deffer1 = async(Dispatchers.IO) {
async1()
}
var deffer2 = async(Dispatchers.IO) {
async2()
}
Log.d("GlobalScope","before sum")
var r1 = deffer1.await()
var r2 = deffer2.await()
val result = r1 + r2
Log.d("GlobalScope","the sum is -> $result")
}
private suspend fun async1(): Int {
delay(1500)
Log.d("GlobalScope","async1")
return 1
}
private suspend fun async2(): Int {
delay(300)
Log.d("GlobalScope","async2")
return 2
}
打印log:
D/GlobalScope: before sum
D/GlobalScope: async2
D/GlobalScope: async1
D/GlobalScope: the sum is -> 3
可以看到async2先执行,因为挂起函数在后面,await是挂起函数。
简化写法:
GlobalScope.launch {
var deffer1 = async(Dispatchers.IO) {
async1()
}
var deffer2 = async(Dispatchers.IO) {
async2()
}
Log.d("GlobalScope","before sum")
val result = deffer1.await() + deffer2.await()
Log.d("GlobalScope","the sum is -> $result")
}
打印log:
D/GlobalScope: before sum
D/GlobalScope: async2
D/GlobalScope: async1
D/GlobalScope: the sum is -> 3
协程的async使用的更多相关文章
- Python PEP 492 中文翻译——协程与async/await语法
原文标题:PEP 0492 -- Coroutines with async and await syntax 原文链接:https://www.python.org/dev/peps/pep-049 ...
- Python的异步编程[0] -> 协程[0] -> 协程和 async / await
协程 / Coroutine 目录 生产者消费者模型 从生成器到异步协程– async/await 协程是在一个线程执行过程中可以在一个子程序的预定或者随机位置中断,然后转而执行别的子程序,在适当的时 ...
- 协程 和 async await
协程, 是 为了 避免 闭包传递变量 的 性能损耗 而产生 . 如果不是 为了 避免 闭包传递变量 的 性能损耗 , 线程池 和 Task 已经够了, 不需要 再设计 出 协程 来 . 闭 ...
- 通过async实现协程的延迟执行及结果获取
在上一次https://www.cnblogs.com/webor2006/p/12022065.html对于协程的async和wait进行了初步的学习,其可以加速执行的性能,其实对于async它是提 ...
- 深入理解协程(三):async/await实现异步协程
原创不易,转载请联系作者 深入理解协程分为三部分进行讲解: 协程的引入 yield from实现异步协程 async/await实现异步协程 本篇为深入理解协程系列文章的最后一篇. 从本篇你将了解到: ...
- async 异步协程进阶
协程通过 async/await 语法进行声明,是编写异步应用的推荐方式 例如新定义一个协程(coroutine object): async def foo(): return 42 首先先来介绍下 ...
- Python3的原生协程(Async/Await)和Tornado异步非阻塞
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_113 我们知道在程序在执行 IO 密集型任务的时候,程序会因为等待 IO 而阻塞,而协程作为一种用户态的轻量级线程,可以帮我们解决 ...
- [转载]Python 3.5 协程究竟是个啥
http://blog.rainy.im/2016/03/10/how-the-heck-does-async-await-work-in-python-3-5/ [译] Python 3.5 协程究 ...
- [译] Python 3.5 协程究竟是个啥
转自:http://blog.rainy.im/2016/03/10/how-the-heck-does-async-await-work-in-python-3-5/ [译] Python 3.5 ...
- Python 原生协程------asyncio
协程 在python3.5以前,写成的实现都是通过生成器的yield from原理实现的, 这样实现的缺点是代码看起来会很乱,于是3.5版本之后python实现了原生的协程,并且引入了async和aw ...
随机推荐
- spring boot设置日志打印为控制台输出和文件输出
日志打印 sources里建logback-spring.xml <?xml version="1.0" encoding="UTF-8"?> &l ...
- [P9253 [PA 2022] Ornitolog 2] 题解
题目 P9253 [PA 2022] Ornitolog 2 题目描述 给你一个长度为 \(n\) 的数列,求至少要修改多少个数才能让数列成为交替鹡鸰鸟鸣的音高序列. 思路 这道题有两种情况. 第一种 ...
- Unity中的string gc优化
在项目中如果有大量的字符串拼接,比如每秒执行的倒计时,协议中的日志输出,每次拼接会产生大量的gc,尤其是在ILRuntime下执行 gc alloc的次数会更加频繁. zstring 有两个字符串处理 ...
- endnote文献使用简明教程+遇到问题
安装下载endnote 1.双击[EndNote X9 v19.0.0.12062 Setup.msi]安装EndNote X9,安装时选择试用,安装完成后不要运行EndNote: 2.如果想使用汉化 ...
- Python 多线程爬取西刺代理
西刺代理是一个国内IP代理,由于代理倒闭了,所以我就把原来的代码放出来供大家学习吧. 首先找到所有的tr标签,与class="odd"的标签,然后提取出来. 然后再依次找到tr标签 ...
- 还没发布就来了?iPhone 15系列机型价格配置图曝光
明天凌晨1点,iPhone 15系列就将正式发布,不过在发布前夕,有网友根据此前的各种爆料,制作了一张有关新iPhone的各型号价格和配置的图片,虽然这并不是官方公布的图片,但是也或多或少包含了人们对 ...
- spring boot jar混淆加密
最近在做一个智能床垫的机构版项目,客户要求部署到客户那边要做代码混淆防止代码被反编译. 一:在需要加密的jar的pom.xml文件添加依赖 <!-- 设置 jitpack.io 仓库 --> ...
- Oracle-报错信息显示问号或者乱码(Oracle 19c)
问题描述: 通过sqlplus登录Oracle19c时,执行SQL出现报错时,显示错误码出现问号: 解决方法: su - oracle vi .bash_profile 添加如下一行内容: ex ...
- ABC 309
直接从 F 开. F 三维偏序. 把盒子按 \(h_i\) 排序,离散化,正常跑三维偏序(注意不能相等). 还要处理 \(h_i\) 相等的情况,可以再把 \(h_i\) 从大到小排序,然后 \(w_ ...
- 【开工大吉】推荐4款开源、美观的WPF UI组件库
前言 经常有小伙伴在技术群里提问:WPF有什么好用的UI组件库?,今天大姚给大家推荐4款开源.美观的WPF UI组件库. WPF介绍 WPF 是一个强大的桌面应用程序框架,用于构建具有丰富用户界面的 ...