我很难理解Akka 2中调度员的差异和推荐用法.我想我理解BalancingDispatcher和CallingThreadDispatcher的行为,但我不知道Dispatcher和PinnedDispatcher.
我不明白的概念Sharability和Bulkheading,无论是.
jxs*_*ord 11
我相信Sharability是指可以共享特定类型的调度员的角色的数量/类型.我不确定批量处理,但我会假设它指的是某种类型的actor分区,你只需要一个actor来"拥有"一个线程.
以下是各种调度程序类型的代码/ scaladoc注释的描述.如果需要更多说明,请描述不清楚的内容:
接线员:
基于事件的Dispatcher一组Actors绑定到一个由a备份的线程池BlockingQueue.
BalancingDispatcher:
基于执行程序的事件驱动调度程序,它将尝试将繁忙的actor中的工作重新分配给空闲的actor.假设使用此调度程序的同一实例的所有actor都可以处理已发送给其中一个actor的所有消息.即演员属于演员池,并且客户端无法保证哪个演员实例实际处理给定的消息.
尽管在该实现中使用的技术通常被称为"工作窃取",但实际实现可能最好被描述为"工作捐赠",因为工作被盗的行为者是主动的.
PinnedDispatcher:
为每个传入的actor作为参考专用线程.通过其messageQueue提供服务.
CallingThreadDispatcher(在akka.testkit中):
Dispatcher仅在当前线程上运行调用.此调度程序不会创建任何新线程,但可以同时为同一个actor使用不同的线程.调度策略是在当前线程上运行,除非目标actor暂停或已经在当前线程上运行(如果它在另一个线程上运行,则该线程将阻塞,直到其他调用完成); 如果未运行调用,则它将在线程本地队列中排队,以便在调用堆栈完成后的活动调用完成后执行.如果仅使用一个线程,则这导致完全确定的执行顺序.
暂停和恢复是一个参与者的全局动作,这意味着它们可以影响不同的线程,这会导致并发症.如果消息在挂起期间排队(线程本地),则在恢复时运行它们的唯一线程是实际调用resume方法的线程.因此,当前没有被耗尽的所有线程本地队列(可能,因为挂起 - 队列 - 恢复可能完全在不同线程上的调用期间发生)被挖掘到当前线程本地队列中,然后执行该队列.可以从其调用堆栈中挂起actor.
| 归档时间: |
|
| 查看次数: |
2352 次 |
| 最近记录: |