[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年。

[转] Scala Async 库 (Scala future, await, async)的更多相关文章

  1. C++并发高级接口:std::async和std::future

    std::async和std::future std::async创建一个后台线程执行传递的任务,这个任务只要是callable object均可,然后返回一个std::future.future储存 ...

  2. callback vs async.js vs promise vs async / await

    需求: A.依次读取 A|B|C 三个文件,如果有失败,则立即终止. B.同时读取 A|B|C 三个文件,如果有失败,则立即终止. 一.callback 需求A: let read = functio ...

  3. javascript异步编程的前世今生,从onclick到await/async

    javascript与异步编程 为了避免资源管理等复杂性的问题, javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是为 ...

  4. 5分种让你了解javascript异步编程的前世今生,从onclick到await/async

      javascript与异步编程 为了避免资源管理等复杂性的问题,javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是 ...

  5. c++多线程基础5(future,async,packaged_task,promise)

    以下内容整理自:https://www.cnblogs.com/my_life/articles/5401190.html future 是一个能从其他地方获取到一个值的对象,如果是在不同的线程中,则 ...

  6. C#中await/async闲说

    自从C#5.0增加异步编程之后,异步编程越来越简单,async和await用的地方越来越多,越来越好用,只要用异步的地方都是一连串的异步,如果想要异步编程的时候,需要从底层开始编写,这样后边使用的时候 ...

  7. 异步编程的上下文与操作符--await/async generator/yield

    上下文的保存机制: 1.保存到异步类型中:promise & future & closure & observable: 2.栈帧保存:其它保存机制: 3.保存到服务提供方的 ...

  8. await/async闲说

    C#中await/async闲说 自从C#5.0增加异步编程之后,异步编程越来越简单,async和await用的地方越来越多,越来越好用,只要用异步的地方都是一连串的异步,如果想要异步编程的时候,需要 ...

  9. 对于Linq关键字和await,async异步关键字的扩展使用

    最近在看neuecc大佬写的一些库:https://neuecc.medium.com/,其中对await,async以及linq一些关键字实现了自定义化使用, 使其不需要引用对应命名空间,不需要多线 ...

随机推荐

  1. MySql 8小时解决方案:proxool连接池

    最近做的项目用的mysql数据库,前天挂在服务器上,昨天早晨上班一来,同事就说API数据接口访问不了了,我马上mstsc登陆服务器看,报错了.马上重启tomcat,结果还能正常运行,当时没管,今天过来 ...

  2. svn建立分支和svn代码合并的操作方法

    首先说下为什么我们需要用到分支-合并.比如项目demo下有两个小组,svn下有一个trunk版.由于客户需求突然变化,导致项目需要做较大改动,此时项目组决定由小组1继续完成原来正进行到一半的工作[某个 ...

  3. shell 用环境变量的值修改properties文件

    假设有如下属性文件 demo.properties user.name=test user.password=123456 ............................... 需求:先需要 ...

  4. 深入解析String#intern

    转自:https://tech.meituan.com/in_depth_understanding_string_intern.html 深入解析String#intern john_yang ·2 ...

  5. sun.misc.BASE64Decoder的风险

    问题描述 最近需要使用Base64上传图片,但是返现sun.misc.BASE64Decoder 为已经过期的包,此包为以前sun公司的内部包,可以下载此包,但是不利于现在Maven方式构建,可能会在 ...

  6. CYUSB3014芯片使用EEPROM无法下载固件说明

    当使用128KB的EEPROM存储CYUSB3014芯片的固件时,需要注意,不同厂家的EEPROM存储器,其A0.A1.A2功能不一样,在设计时电路也不一样.Microchip对应的128KB的EEP ...

  7. java中创建对象的方法

    有4种显式地创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor ...

  8. Apps: Help > Diagnostics > Custom Code > Personalize 查看LOV中的查询语句

    Apps Menu Path: Help > Diagnostics > Custom Code > Personalize 查看LOV中的查询语句   一直有实施顾问询问我XXFo ...

  9. [Erlang22]如何按规则位数输出数字

      需求:把一个数字指定长度输出 例如:  1 00000001 12 00000012 1203 00001203 123456789 123456789 1234567 01234567 方法一: ...

  10. 一.Jenkins的windows安装

    1,打开jinkens官网: https://jenkins.io/ ,点击 Download 进入下载界面 2,选择 Long-term Support 版本(推荐选择长期支持版本)->Win ...