为了账号安全,请及时绑定邮箱和手机立即绑定

您将如何使用 Scala 的异步超时多个异步请求?

您将如何使用 Scala 的异步超时多个异步请求?

Go
蓝山帝景 2021-07-31 13:51:20
我不知道 Scala,但我很好奇它的异步功能(类似于 C# 的)。你如何将这个 go 代码翻译成 Scala 异步?http://talks.golang.org/2012/concurrency.slide#47c := make(chan Result)go func() { c <- Web(query) } ()go func() { c <- Image(query) } ()go func() { c <- Video(query) } ()timeout := time.After(80 * time.Millisecond)for i := 0; i < 3; i++ {    select {    case result := <-c:        results = append(results, result)    case <-timeout:        fmt.Println("timed out")        return    }}return
查看完整描述

1 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

这是如何完成的草图(未经测试;我不声称这是最好的解决方案):


// I assume that the Web/Image/Video functions return instances of Future[Result]

val f1 = Web(query)

val f2 = Image(query)

val f3 = Video(query)

val t = timeout(80.milliseconds)


// using Scala's Future API

val results: Future[Seq[Result]] = for {

  r1 <- or(f1)(t)

  r2 <- or(f2)(t)

  r3 <- or(f3)(t)

} yield (r1.toSeq ++ r2.toSeq ++ r3.toSeq)


// OR using async

val results: Future[Seq[Result]] = async {

  val r1 = or(f1)(t)

  val r2 = or(f2)(t)

  val r3 = or(f3)(t)

  await(r1).toSeq ++ await(r2).toSeq ++ await(r3).toSeq

}


// or and timeout are utility/library functions defined below


def or[T](f1: Future[T])(f2: Future[Option[Nothing]]): Future[Option[T]] =

  Future.firstCompletedOf(f1 map Some.apply, f2)


// create a future that will complete successfully with None

// after the given duration passes

def timeout(d: Duration): Future[Option[Nothing]] = {

  val p = Promise[Option[Nothing]]

  Scheduler.after(d) { p success None }

  p.future

}


查看完整回答
反对 回复 2021-08-02
  • 1 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信