由于Scala提供了一个处理并发性的很好的套件(Akka,并行集合,期货等),它也让我有些困惑。有什么样的指导线何时使用?某种最佳做法?
答案 0 :(得分:2)
首先,concurrency != parallelism。后者可以用于基本上以顺序方式推理的问题,但是可以有效地划分成可以独立处理的块(在最后再次组合之前)。例如,映射和过滤集合,这将是并行集合的场景。
其他一些人对actors versus futures有所了解。简而言之,演员在某种意义上说是OO,每个演员都可以封装自己的内部状态,他们更像是黑盒子。演员并发性也是不确定的,而数据流和期货是确定性的。当您想要跨多台计算机分发任务时,演员是一种自然的选择。参与者可以接受多种类型的消息,而期货允许函数组合超过一种特定类型。 (这是简化的,因为Akka现在有类型的频道,我想它可以更容易组合)。演员适合等待请求的服务,而期货可以被认为是懒惰的答案。
如果您有多个并发线程,software transactional memory (STM)也是一个有用的抽象。 STM本身不管理线程池或并发任务,但与它们结合使用时,它会以安全的方式处理可变状态。