利用多核最基本的机制就是并行

一、有四种类型的 Dispatcher 可以用于描述如何在 Actor 之间共享线程:

Dispatcher :默认的 Dispatcher 类型。将会使用定义的 Executor ,在 Actor 中处

理消息。在大多数情况下,这种类型能够提供最好的性能。

 PinnedDispatcher:给每 个 Actor 都分配自己独有的线程。这种类型的 Dispatcher

为每个 Actor 都创建一个 ThreadPool Executor ,每个 Executor 中都包含一个线程。 如果希望确保每个 Actor 都能够立即响应,那么这似乎是个不错的方法。不过 PinnedDispatcher 比其他共享资源的方法效率更高的情况其实并不多。可以在单 个 Actor 必须处理很多重要工作的时候试试这种类型的 Dispatcher ,否则的话不 推荐使用。

CallingThreadDispatcher :这个 Dispatcher 比较特殊,它没有 Executor ,而是在 发起调用的线程上执行工作。这种 Dispatcher 主要用于测试,特别是调试。由于 发起调用的线程负责完成工作,所以清楚地看到栈追踪信息,了解所执行方法的 完整上下文。这对于理解异常是非常有用的。每个 Actor 会获取一个锁,所以每 次只有一个线程可以在 Actor 中执行代码,而如果多个线程向一个 Actor 发送信 息的话,就会导致除了拥有锁的线程之外的所有线程处于等待状态。本书前面介 绍过的 TestActorRef 就是基于 CallingThreadDispatcher 实现支持在测试中同步执 行工作的。

BalancingDispatcher :我们会在一些 Akka 文档中看到 BalancingDispatcher 。 现在已经不推荐直接使用 BalancingDispatcher 了,应该使用前面介绍过的 BalancingPool Router 。不过Akka 中仍然使用了BalancingDispatcher ,但是只 会通过 Router 间接使用。我们会在“用于解析文章的 Dispatcher ”小节中介绍 BalancingPool 的实际用法。BalancingDispatcher 有一点很特殊:Pool 中的所有 Actor 都共享同一个邮箱,并且会为 Pool 中的每个 Actor 都创建一个线程。使 用 BalancingDispatcher 的 Actor 从邮箱中拉取消息,所以只要有 Actor 处于空 闲状态,就不会有任何 Actor 的工作队列中存在任务。这是工作窃取的一个变 种,所有 Actor 都会从一个共享的邮箱中拉取任务。两者在性能上的优点也 类似。