withTimeoutOrNull:

在上一次https://www.cnblogs.com/webor2006/p/12010388.html中对于协程的超时机制进行了一个学习,上次用的是withTimeout()函数,还有一个重载这次来看一下:

先来说一下它产生的背景,我们知道在上一次用withTimeout()时如果超时了会抛出一个异常:

该异常是CancellationException的子类,当该异常抛出时,我们并未在控制台上看到整个异常堆栈信息,这是因为在取消的协程当中,CancellationException被认为是一种协程完成的正常原因而已。不过,我们在该示例中,是在main函数中使用了withTimeout函数调用,既然CancellationException仅仅只是个异常而已,所有的资源也都会以通常的方式来关闭,那么我们就可以将相关代码放到一个try...catch块中;此外,Kotlin还提供了另外一个更加友好的函数调用:withTimeoutOrNull;从功能角度来着,它非常类似于withTimeout,不过当超时发生时,它并不会抛出CancellationException异常,而是会直接返回null。

对于withTimeout函数调用来说,如果将其放置到try...catch块中,那么调用形式就是下面这样:

但是!!如果咱们采用withTimeoutOrNull来使用的话,其形式就会变成这样:

那如果改为正常执行呢?

至此对于协程的超时机制就学习完了。

async与await:

接下来学习一个全新的知识点,关于它貌似前阵在学习小程序的开发中也看到过,当时看着也是感觉挺陌生的一个写法,不过当时是在JS中的代码,这里是在Kotlin语言中,那接下来好好学学它,也有助于微信开发的这块用法的理解,下面先从一个挂起函数的组合使用开始:

接下来则将2个挂起函数的值进行累加并打印,而且还打印一下调用这俩挂起函数的消耗总时间,这里有个小细节说明一下:说到函数的执行时间的打印可能通常的做法是这样:

但是Kotlin为咱们提供了一个这种功能的现有函数,不用咱们自己来手动写了,如下:

这个程序比较好理解,也很自然,这里来分析一下这种传统写法的弊端:

此时,async与await的使用场景就出来了,下面先对其理论进行了解:

从概念上来说,async就像是launch一样,它会开启一个单独的协程,这个协程是个轻量级线程,可以与其他协程并发工作。区别在于,launch会返回一个Job,但是Job并不会持有任何结果值,而async会返回一个Deferred,这是一个轻量级的非阻塞的future,它代表一个promise,可以在稍后提供一个结果值。

可以通过在一个deferred值上调用.await()方法来获取最终的结果值,Deferred也是个Job,因此可以在需要时对其进行取消。

好,先来看一下Deferred这个跟Job是啥关系:

所以说Deferred就是一个Job,好,下面咱们来改造一下程序,看是否能缩短执行时间:

其中可以看到async是一个扩展函数:

而await()是Deferred中定义的,如下:

通过async与await实现高效并发的更多相关文章

  1. 《C#并发编程经典实例》学习笔记—异步编程关键字 Async和Await

    C# 5.0 推出async和await,最早是.NET Framework 4.5引入,可以在Visual Studio 2012使用.在此之前的异步编程实现难度较高,async使异步编程的实现变得 ...

  2. Async and Await 异步和等待

    [第一次这么耐下性子认真写博客,虽然觉得很认真了,当毕竟是第一次嘛,以后再看肯定觉得很不咋滴的,更何况园子里有那么多的高人和大侠,这篇文章就权当练练手了,熟悉一下用客户端发表博客了,也希望大家多多照顾 ...

  3. async和await关键字实现异步编程

    async和await关键字实现异步编程 异步编程   概念 异步编程核心为异步操作,该操作一旦启动将在一段时间内完成.所谓异步,关键是实现了两点:(1)正在执行的此操作,不会阻塞原来的线程(2)一旦 ...

  4. async和await的使用总结 ~ 竟然一直用错了c#中的async和await的使用。。

    对于c#中的async和await的使用,没想到我一直竟然都有一个错误.. ..还是总结太少,这里记录下. 这里以做早餐为例 流程如下: 倒一杯咖啡. 加热平底锅,然后煎两个鸡蛋. 煎三片培根. 烤两 ...

  5. (译)关于async与await的FAQ

    传送门:异步编程系列目录…… 环境:VS2012(尽管System.Threading.Tasks在.net4.0就引入,在.net4.5中为其增加了更丰富的API及性能提升,另外关键字”async” ...

  6. Async 和 Await的性能(.NET4.5新异步编程模型)

    异步编程长时间以来一直都是那些技能高超.喜欢挑战自我的开发人员涉足的领域 — 这些人愿意花费时间,充满热情并拥有心理承受能力,能够在非线性的控制流程中不断地琢磨回调,之后再回调. 随着 Microso ...

  7. 关于async与await的FAQ 转

    (译)关于async与await的FAQ 传送门:异步编程系列目录…… 环境:VS2012(尽管System.Threading.Tasks在.net4.0就引入,在.net4.5中为其增加了更丰富的 ...

  8. Promise,Async,await简介

    Promise 对象 转载:http://wiki.jikexueyuan.com/project/es6/promise.html 基本用法 ES6 原生提供了 Promise 对象.所谓 Prom ...

  9. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

随机推荐

  1. MySQL实战45讲学习笔记:第一讲

    一.MySQL逻架构图 二.连接器工作原理刨析 1.连接器工作原理图 2.原理图说明 1.连接命令 mysql -h$ip -P$port -u$user -p 2.查询链接状态 3.长连接端连接 1 ...

  2. [LeetCode] 76. Minimum Window Substring 最小窗口子串

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  3. 小程序1px边框在苹果机上变粗问题

    在ios系统上1px的边框会变成2px,ui会感觉很粗 列表间隔,只需要一条边框 .border:after { position: absolute; content: ''; width: 100 ...

  4. Code Review最佳实践(转)

    我一直认为Code Review(代码审查)是软件开发中的最佳实践之一,可以有效提高整体代码质量,及时发现代码中可能存在的问题.包括像Google.微软这些公司,Code Review都是基本要求,代 ...

  5. 从时序异常检测(Time series anomaly detection algorithm)算法原理讨论到时序异常检测应用的思考

    1. 主要观点总结 0x1:什么场景下应用时序算法有效 历史数据可以被用来预测未来数据,对于一些周期性或者趋势性较强的时间序列领域问题,时序分解和时序预测算法可以发挥较好的作用,例如: 四季与天气的关 ...

  6. 【leetcode-449】序列化和反序列化二叉搜索树

    序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建. 设计一个算法来序列化和反序列化二叉搜索树. 对序列 ...

  7. .Net Core中文编码问题

    原文:https://www.cnblogs.com/ideacore/p/6964771.html 问题 .net core环境下,使用HttpClient执行GetStringAsync的时候,报 ...

  8. 输入www.baidu.com会发生什么

    1. 浏览器接收域名 2. 发送域名给DNS,请求解析出www.baidu.com的IP地址 中文名字是域名系统服务器,一般位于ISP(互联网服务提供商,比如我们熟知的联通.移动.电信等) 中.浏览器 ...

  9. pyhanlp的安装

    github 的官方地址:https://github.com/hankcs/pyhanlp conda install -c conda-forge jpype1 pip install pyhan ...

  10. 设计模式之(十二)享元模式(Flyweight)

    享元模式思想 就以小时候导锅来说吧(导锅是我家乡的方言,就是用细沙把一个模型锅的形状拓下来,然后把铝水倒进模型中,就导好一个锅了.小时候很喜欢看的,可惜现在看不到了.上个图片回忆下)了解了这个过程后就 ...