scala – Akka 2的调度员有什么区别和使用方式?
我很难理解
dispatchers in Akka 2的差异和推荐用法。我想我明白了
BalancingDispatcher和
CallingThreadDispatcher的行为,但我不知道
Dispatcher和
PinnedDispatcher。
我也不了解Sharability和Bulkheading的概念。 解决方法
我相信Sharability是指可以共享特定类型的调度员的演员的数量/类型。我不确定散文,但我要假设它是指某种类型的actor分区,你只需要一个actor来“拥有”一个线程。
以下是各种调度器类型的代码/ scaladoc注释的描述。如果需要更多的澄清,请描述什么不清楚: 接线员: 基于事件的Dispatcher将一组Actors绑定到由BlockingQueue备份的线程池。 BalancingDispatcher: 一个基于执行者的事件驱动调度程序,将尝试将忙碌演员的工作重新分配给空闲演员。假设使用同一个调度程序实例的所有演员都可以处理已发送给其中一个演员的所有消息。即演员属于一组演员,客户端不能保证哪个actor实际上处理给定的消息。 虽然这种实现中使用的技术通常被称为“偷窃”,但实际执行可能最好被描述为“工作捐赠”,因为被盗用的演员主动。 PinnedDispatcher: 为参与传入的每个演员奉献一个独特的线索。通过其messageQueue服务。 CallingThreadDispatcher(在akka.testkit中): 调度程序仅在当前线程上运行调用。此调度程序不会创建任何新的线程,但可以为同一个actor并发使用不同的线程。调度策略是在当前线程上运行,除非目标线程程序被暂停或已经在当前线程上运行(如果它在不同的线程上运行,则该线程将阻塞直到其他调用完成);如果调用未运行,则在线程本地队列中进行排队,以便在调用堆栈进一步完成后进行主动调用。如果只使用一个线程,这将导致完全确定的执行顺序。 暂停和恢复是一个actor的全局操作,这意味着它们可以影响不同的线程,从而导致并发症。如果邮件在暂停期间排队(线程本地),则在恢复时运行它们的唯一线程是实际调用resume方法的线程。因此,当前没有排除的所有线程本地队列(可能,因为挂起队列恢复可能完全在不同线程的调用期间发生)被舀到当前的线程本地队列中,然后执行该队列。可以在其呼叫堆栈内挂起一个actor。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |