我一直在研究 scala 和 AKKA 来管理一个明显可并行化的算法。我有一些函数式编程的知识,并且主要使用 Java,所以我的 FP 可能还不是最好的。
我正在使用的算法非常简单,有一个顶级计算:
def computeFull(...): FullObject
此计算调用子计算,然后将其汇总(以简化):
def computePartial(...): Int
并computeFull
做这样的事情(再次简化):
val partials = for(x <- 1 to 10
y <- 1 to 10) yield computePartial(x, y)
partials.foldLeft(0)(_ + _)
因此,它非常接近 AKKA 示例,进行 PI 计算。我有很多 computeFull 可以调用,并且每个里面都有很多 computePartial。所以我可以将所有这些包装在 AKKA 演员中,或者在 Futures 中简化,在单独的线程中调用每个 computeFull 和每个 computePartial。然后我可以使用http://doc.akka.io/docs/akka/snapshot/scala/futures.html的 fold、zip 和 map 函数来组合期货。
但是,这意味着 computeFull 和 computePartial 必须返回包含实际结果的 Futures。因此,他们变得依赖于 AKKA,并假设事情是并行运行的。事实上,我还必须在我的函数中隐式传递执行上下文。
我认为这很奇怪,算法“不应该”知道它是如何并行化的细节,或者它是否是。
在阅读了 scala 中的 Futures(而不是 AKKA 的)并查看了代码延续之后。scala (http://www.scala-lang.org/api/current/scala/Responder.html) 提供的 Responder monad 似乎是抽象函数调用如何运行的正确方法。我有这种模糊的直觉,computeFull 和 computePartial 可以返回 Responders 而不是期货,并且当执行 monad 时,它决定嵌入在 Responder 中的代码如何执行(如果它产生一个新的 actor 或者它是否在同一个线程上执行)。
但是,我不确定如何得到这个结果。有什么建议么?你认为我走对了吗?