• 通过async与await实现高效并发


    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中定义的,如下:

  • 相关阅读:
    2.搭建第一个http服务:三层架构
    1.基础入门
    MyISAM和InnoDB索引区别
    分区
    事务的四大特性
    事务
    String
    自己写native方法
    序列化和反序列化
    反射
  • 原文地址:https://www.cnblogs.com/webor2006/p/12022065.html
Copyright © 2020-2023  润新知