【发布时间】:2010-03-13 17:27:25
【问题描述】:
是什么让演员如此轻量级?
我什至不确定它们是如何工作的。它们不是分开的线程吗?
【问题讨论】:
-
我想补充一下这个问题:Scala Actors 有多轻量级?
是什么让演员如此轻量级?
我什至不确定它们是如何工作的。它们不是分开的线程吗?
【问题讨论】:
当他们说轻量级时,他们的意思是每个参与者都没有映射到单个线程。
JVM 提供共享内存线程 锁作为主要形式 并发抽象。但共享 内存线程相当重量级 并招致严重的性能损失 从上下文切换开销。为了 基于a的actor实现 与 JVM 线程的一对一映射, 每个 Scala 参与者的进程有效负载 不会像我们能做的那样轻巧 产生一百万个演员实例 用于特定计算。因此 Scala 演员被设计为 轻量级事件对象,它得到 计划和执行 底层工作线程池 全部时自动调整大小 长时间运行时线程阻塞 操作。事实上,Scala 实现了 演员的统一模型 - 线程 基于和基于事件。斯卡拉演员 提供两种形式的暂停 机制 - 完整的堆栈框架 暂停(实现为接收)和 基于延续的暂停 关闭(实现为反应)。在 基于事件的演员的情况,等待 反应由延续表示 闭包,即捕获的闭包 演员的其余计算。 当被挂起的actor收到一个 匹配其中之一的消息 演员中指定的模式, 延续是通过调度来执行的 任务到工作线程之一 从底层线程池。这 paper“统一线程和 事件”由 Haller 和 Odersky 讨论的细节 实施。
【讨论】:
重要参考Actors that Unify Threads and Events
我认为我们不应该加强那个轻量级的演员。
首先基于线程的actor是每个线程的actor,所以根本不是轻量级的。
基于事件的演员是我们开始觉得演员是轻量级的地方。它是轻量级的,因为它没有工作线程等待并切换到另一个,工作线程只是从一个数据工作切换到另一个数据工作,从而继续进行有效的计算。
【讨论】: