我很难理解它们的差异和推荐用法Akka 2 中的调度程序 http://doc.akka.io/docs/akka/current/scala/dispatchers.html。我想我明白了平衡调度程序 http://doc.akka.io/api/akka/current/#akka.dispatch.BalancingDispatcher和调用线程调度程序 http://doc.akka.io/api/akka/current/#akka.testkit.CallingThreadDispatcher表现良好,但我不知道调度员 http://doc.akka.io/api/akka/current/#akka.dispatch.Dispatcher and 固定调度程序 http://doc.akka.io/api/akka/current/#akka.dispatch.PinnedDispatcher.
我不明白这些概念Sharability
and Bulkheading
, 任何一个。
我认为可共享性是指可以共享特定类型调度程序的参与者的数量/类型。我不确定舱壁,但我假设它指的是某种参与者分区,您只希望一个参与者“拥有”一个线程。
以下是各种调度程序类型的代码/scaladoc 注释中的描述。如果需要更多说明,请描述不清楚的地方:
调度员:
基于事件的Dispatcher
将一组 Actor 绑定到一个由BlockingQueue
.
平衡调度程序:
基于执行器的事件驱动调度程序,它将尝试将工作从繁忙的参与者重新分配给空闲的参与者。假设使用此调度程序的同一实例的所有参与者都可以处理已发送到其中一个参与者的所有消息。 IE。参与者属于参与者池,并且对于客户端来说,无法保证哪个参与者实例实际处理给定的消息。
尽管此实现中使用的技术通常被称为“工作窃取”,但实际的实现可能最好被描述为“工作捐赠”,因为被窃取工作的参与者采取了主动。
固定调度程序:
为作为参考传入的每个参与者指定一个唯一的线程。通过其消息队列提供服务。
调用ThreadDispatcher(在akka.testkit中):
仅在当前线程上运行调用的调度程序。该调度程序不会创建任何新线程,但它可以在不同线程中同时用于同一参与者。调度策略是在当前线程上运行,除非目标 actor 已挂起或已在当前线程上运行(如果它在不同线程上运行,则该线程将阻塞,直到其他调用完成);如果调用未运行,则会在线程本地队列中排队,以便在调用堆栈上方的活动调用完成后执行。如果仅使用一个线程,这会导致完全确定的执行顺序。
挂起和恢复是一个参与者的全局操作,这意味着它们可以影响不同的线程,从而导致复杂性。如果消息在挂起期间排队(线程本地),则在恢复时运行它们的唯一线程是实际调用恢复方法的线程。因此,当前未耗尽的所有线程本地队列(这是可能的,因为挂起队列恢复可能完全在不同线程上的调用期间发生)被舀入当前线程本地队列,然后执行。可以从调用堆栈中暂停参与者。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)