zoukankan      html  css  js  c++  java
  • [转] Scala Async 库 (Scala future, await, async)

    [From] https://colobu.com/2016/02/15/Scala-Async/

    在我以前的文章中,我介绍了Scala Future and PromiseFuture代表一个异步计算,你可以设置你的回调函数或者利用Await.result等待获取异步计算的结果,你还可以组合多个future为一个新的futurePromise让你可以控制是否完成计算还是抛出异常,它的future方法返回一个Future对象,completesuccessfailure允许你完成计算。如果想要同步操作,可以使用Await.result等待Future完成或者超时,对于没有实现Awaitable的代码块,可以使用blocking方法实现同步执行。

    以上是对上一篇文章的总结。Scala官方还提供了一个Async库,用来简化Scala异步操作,尽管这个库还没有正式加入到Scala的标准库中。它是通过Scala macro特性实现的。

    async用来标记一块异步执行的代码,通常这块代码中包含包含一个或者多个await调用。如果没有await调用,我们用future方法就可以了。
    这样,对于复杂的异步代码,你不必使用mapflatMap或者回调来实现复杂的多层的调用嵌套。

    import ExecutionContext.Implicits.global
    import scala.async.Async.{async, await}
    val future = async {
      val f1 = async { ...; true }
      val f2 = async { ...; 42 }
      if (await(f1)) await(f2) else 0
    }

    比如下面的代码,我们使用纯future实现:

    def slowCalcFuture: Future[Int] = {
        val future1 = slowCalcFuture
        val future2 = slowCalcFuture
        def combined: Future[Int] = for {
          r1 <- future1
          r2 <- future2
        } yield r1 + r2
    }

    如果使用async/await, 代码将得到简化。

    def slowCalcFuture: Future[Int] = async {
      val future1 = slowCalcFuture
      val future2 = slowCalcFuture
      await(future1) + await(future2)
    }

    事实上,这个框架是SIP-22 - Async的参考实现。这个Scala特性提议发布于2013年。

  • 相关阅读:
    JS实现前台表格排序功能
    openoffice安装手记
    OpenOffice 实现OFFICE在线预览
    毫秒事件转换小方法
    axis2 jar包详解及缺少jar包异常分析
    Android EditText控件完美实现只读(ReadOnly/NonEditable)
    android:获取联系人信息(姓名和电话)
    dex2jar.bat反编译apk的classes.dex文件错误:
    服务器压力测试系列二:服务器监控工具tsar安装
    memcache list all keys
  • 原文地址:https://www.cnblogs.com/pekkle/p/10271201.html
Copyright © 2011-2022 走看看