是什么让演员如此轻盈?
我什至不确定它们是如何工作的。它们不是分开的线程吗?
当他们说轻量级时,他们的意思是每个参与者都没有映射到单个线程。
JVM 提供带锁的共享内存线程作为并发抽象的主要形式。但是共享内存线程非常重量级,并且会因上下文切换开销而导致严重的性能损失。对于基于与 JVM 线程的一对一映射的 Actor 实现,每个 Scala Actor 的进程负载不会像我们可以为特定计算生成一百万个 Actor 实例那样轻量级。因此,Scala Actor 被设计为轻量级事件对象,它们在底层工作线程池上调度和执行,当所有线程阻塞长时间运行的操作时,该线程池会自动调整大小。事实上,Scala 实现了一个统一的actor模型——基于线程和基于事件。Scala actor 提供了两种形式的暂停机制——全栈帧暂停(实现为接收)和基于连续闭包的暂停(实现为反应)。在基于事件的参与者的情况下,等待反应由一个延续闭包表示,即一个捕获参与者其余计算的闭包。当挂起的actor接收到与actor中指定的模式之一匹配的消息时,通过将任务调度到底层线程池中的一个工作线程来执行延续。这 s 计算。当挂起的actor接收到与actor中指定的模式之一匹配的消息时,通过将任务调度到底层线程池中的一个工作线程来执行延续。这 s 计算。当挂起的actor接收到与actor中指定的模式之一匹配的消息时,通过将任务调度到底层线程池中的一个工作线程来执行延续。这 Haller 和 Odersky 的论文 “统一线程和事件的参与者”讨论了实现的细节。
统一线程和事件的重要参考Actor
我不认为我们应该加强那个演员是轻量级的。
首先,基于线程的演员是每个线程的演员,所以根本不是轻量级的。
基于事件的演员是我们开始觉得演员是轻量级的地方。它是轻量级的,因为它没有工作线程等待并切换到另一个,工作线程只是从一个数据工作切换到另一个数据工作,从而继续进行有效的计算。