是什么让演员如此轻量级?
我甚至不确定它们是如何工作的。他们不是分开的线程吗?
答案 0 :(得分:17)
当他们说轻量级时,他们意味着每个actor都没有映射到单个线程。
JVM提供共享内存线程 锁作为主要形式 并发抽象。但是分享了 内存线程非常重量级 并导致严重的性能惩罚 来自上下文切换开销。对于 基于a的actor实现 使用JVM线程进行一对一映射, 每个Scala actor的进程负载 不会像我们那样轻巧 产生一百万个演员实例 用于特定的计算。于是 Scala演员被设计为 得到的轻量级事件对象 预定并执行 底层工作者线程池 全部自动调整大小 线程阻止长时间运行 操作。实际上,Scala实现了 统一的演员模型 - 线程 基于事件和基于事件。斯卡拉演员 提供两种形式的暂停 机制 - 完整的堆栈框架 暂停(实施为接收)和 基于延续的暂停 关闭(实施为反应)。在 基于事件的演员案例,等待 反应由延续表示 闭合,即捕获的闭合 演员计算的其余部分。 当被停职的演员收到一个 与之一匹配的消息 演员指定的模式, 继续通过调度执行 任务到一个工作线程 来自底层线程池。该 paper“统一线程和线程的参与者 事件“由哈勒和奥德斯基 讨论了细节 实施
答案 1 :(得分:0)
重要参考Actors that Unify Threads and Events
我认为我们不应该强化那个轻量级的演员。
首先,基于线程的actor是每个线程的actor,所以根本不是轻量级的。
基于事件的演员是我们开始觉得演员重量轻的地方。它重量轻,因为它没有工作线程等待并切换到另一个,工作线程只是从一个数据工作切换到另一个数据工作,因此保持旋转有效的计算。