【问题标题】:Scala: Why are Actors lightweight?Scala:为什么 Actor 是轻量级的?
【发布时间】:2010-03-13 17:27:25
【问题描述】:

是什么让演员如此轻量级?

我什至不确定它们是如何工作的。它们不是分开的线程吗?

【问题讨论】:

  • 我想补充一下这个问题:Scala Actors 有多轻量级?

标签: scala actor


【解决方案1】:

当他们说轻量级时,他们的意思是每个参与者都没有映射到单个线程。

JVM 提供共享内存线程 锁作为主要形式 并发抽象。但共享 内存线程相当重量级 并招致严重的性能损失 从上下文切换开销。为了 基于a的actor实现 与 JVM 线程的一对一映射, 每个 Scala 参与者的进程有效负载 不会像我们能做的那样轻巧 产生一百万个演员实例 用于特定计算。因此 Scala 演员被设计为 轻量级事件对象,它得到 计划和执行 底层工作线程池 全部时自动调整大小 长时间运行时线程阻塞 操作。事实上,Scala 实现了 演员的统一模型 - 线程 基于和基于事件。斯卡拉演员 提供两种形式的暂停 机制 - 完整的堆栈框架 暂停(实现为接收)和 基于延续的暂停 关闭(实现为反应)。在 基于事件的演员的情况,等待 反应由延续表示 闭包,即捕获的闭包 演员的其余计算。 当被挂起的actor收到一个 匹配其中之一的消息 演员中指定的模式, 延续是通过调度来执行的 任务到工作线程之一 从底层线程池。这 paper“统一线程和 事件”由 Haller 和 Odersky 讨论的细节 实施。

Source

【讨论】:

  • 如果抛出异常,只有actor(而不是底层线程)会死,对吧?
  • @someguy - 我认为这真的取决于线程池的实现,但是是的。
【解决方案2】:

重要参考Actors that Unify Threads and Events

我认为我们不应该加强那个轻量级的演员。

首先基于线程的actor是每个线程的actor,所以根本不是轻量级的。

基于事件的演员是我们开始觉得演员是轻量级的地方。它是轻量级的,因为它没有工作线程等待并切换到另一个,工作线程只是从一个数据工作切换到另一个数据工作,从而继续进行有效的计算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-27
    • 2020-12-22
    • 1970-01-01
    • 2011-01-08
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多