gpt4 book ai didi

multithreading - 为什么Akka Actor 与线人如此不同

转载 作者:行者123 更新时间:2023-12-03 13:00:12 26 4
gpt4 key购买 nike

我有一个 Actor 来控制GUI。
为了保证即时响应(不卡在屏幕上),我将PinnedDispatcher分配给此actor。

val system = ActorSystem("sys1")
def createMonitor(clients:Seq[ActorRef],init_QPS:Int) = system.actorOf(Props( new MonitorGUI) ).withDispatcher("my-pinned-dispatcher"))

配置文件就像
my-pinned-dispatcher {
executor = "thread-pool-executor"
type = PinnedDispatcher
}

Actor 程序是这样的
class MonitorGUI() extends Actor {
val rate = 1000 milliseconds
val scheduler = context.system.scheduler
def receive = {

case GUIRefresh =>
GUI.refresh()
case StartMonitor =>
scheduler.schedule( rate + (300 milliseconds), rate ,self, GUIRefresh )
}
}

调度程序应每秒调用一次“刷新”。
但是,当有许多其他参与者进行大量的繁重计算(例如98%的CPU)时,调度程序将无法保证每秒刷新一次。例如,GUI卡住了5秒钟。
但是,纯线程程序比actor程序的响应能力强得多,如下所示:
new Thread(new Runnable {
override def run(): Unit = {
while (true){
GUI.refresh
Thread.sleep(1000)
}
}
}).start()

我想知道线程和 Actor 为什么如此不同。因为这个参与者应该有自己的线程。应该没有区别。

最佳答案

参与者不是像线程那样的抢占对象。当一个actor开始处理一条消息时,它将继续进行处理,直到完成该消息,然后才可以运行另一个actor。出于高吞吐量的考虑,这是一项设计决策(它消除了上下文切换),但是在编写参与者代码时需要意识到这一点。

请确保没有一条消息的处理时间超过所需的延迟时间(可能是通过将计算拆分成较小的单元并发送新消息以触发每个步骤),或者对具有大量计算的参与者使用了单独的执行上下文/调度程序和对延迟敏感的参与者。 (理想情况下,您可能要确保两个上下文中的线程总数等于物理CPU内核的数量,以使两个上下文中的任何一个线程都不能阻塞另一个线程)。

关于multithreading - 为什么Akka Actor 与线人如此不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26581823/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com