斯卡拉:为什么演员轻量级?

问题描述 投票:11回答:2

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

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

scala actor
2个回答
17
投票

当他们说轻量级时,他们意味着每个actor都没有映射到一个线程。

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

Source


0
投票

重要参考Actors that Unify Threads and Events

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.