首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Scala Futures进行并行计算

使用Scala Futures进行并行计算
EN

Stack Overflow用户
提问于 2019-09-17 13:27:36
回答 2查看 178关注 0票数 0

我有一个函数,可以计算两个子函数,如下所示。

代码语言:javascript
运行
复制
def someFutureMethod1(input: Int): Int = {
      input + 1
    }

def someFutureMethod2(input: Int): Int = {
      input + 12
    }

def method1(sx: Int): Future[Int] = Future {

      val future: Int = someFutureMethod1(sx)
      val future2: Int = someFutureMethod2(future)

future.andThen{
return future
}
future2.andThen{
return future2
}


}

Print(method1(10))


expected result:
11
23

我想在第一个函数计算时立即返回结果,并在第二个函数计算时更新或附加到相同的结果。

第二个函数依赖于第一个function.As,一旦第一个函数成功执行,就应该返回结果。并将第一函数结果传递给第二函数以计算第二函数。如果计算了第二个函数,则只返回第二个函数的结果。

有没有办法做到这一点?

提前感谢!!

EN

回答 2

Stack Overflow用户

发布于 2019-09-17 13:57:35

检查此代码片段(有函数签名修改),

代码语言:javascript
运行
复制
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global


def someFutureMethod1(input: Int): Future[Int] = Future {
  input + 1
}

def someFutureMethod2(input: Int): Future[Int] = Future {
  input + 12
}

def method1(sx: Int): Future[Int] = {
  val future1 = someFutureMethod1(sx)
  val future2 = someFutureMethod2(sx)

  for {
    f1 <- future1
    f2 <- future2
  } yield {
    f1 + f2 //add logic for your final output
  }
}
票数 1
EN

Stack Overflow用户

发布于 2019-09-17 17:04:11

好的,你可以这样做:

代码语言:javascript
运行
复制
implicit val ec = Implicits.global

  def someFutureMethod1(input: AtomicInteger): Unit = {
    Future {
      input.addAndGet(1)
      println(input + " after method 1. And maybe also after method 2, because who knows.")
    }
  }

  def someFutureMethod2(input: AtomicInteger): Unit = {
    Future {
      input.addAndGet(12)
      println(input + " after method 2. And maybe also after method 1...")
    }
  }

  val at = new AtomicInteger(1)
  someFutureMethod1(at)
  someFutureMethod2(at)
  println(at + " at any point before or after the futures, so a pretty random value.")
  Thread.sleep(1000)
  println(at + " after all the futures. Probably.")

我添加了所有println,这样代码就可以复制、粘贴和运行了。它会在你每次运行它时产生不同的输出,这应该是你运行和逃离的线索!

我不会在我管理的任何代码库中接受这个代码,我甚至不会接受它作为POC。这是完全不可预测的。基本上,method1和method2中的4条指令可以按任何顺序执行。

还要注意的是,它不能保证首先执行method1。

如果需要,您可以像这样更改代码,以确保在调用第二个方法之前解析第一个未来:

代码语言:javascript
运行
复制
  //Fluff removed

  def someFutureMethod1(input: AtomicInteger): Future[Unit] = {
    Future {
      input.addAndGet(1)
    }
  }

  def someFutureMethod2(input: AtomicInteger): Future[Unit] = {
    Future {
      input.addAndGet(12)
    }
  }

  def theUglyMethod(at: AtomicInteger) = someFutureMethod1(at).map {_ =>
    someFutureMethod2(at)
    at
  }

再一次,请不要这样做!^^

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57967833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档