gpt4 book ai didi

akka - Akka Actor 执行是否互斥?

转载 作者:行者123 更新时间:2023-12-01 09:53:24 25 4
gpt4 key购买 nike

发件人:https://www.chrisstucchio.com/blog/2013/actors_vs_futures.html表明这是安全的:

class FooCounter extends Actor {
var count: Long = 0

def receive = {
case Foo => { count += 1}
case FooCountRequest => { sender ! count }
}
}

会不会有多个同时调用接收,使得count的值不确定。

我的理解是,如果对此对象的接收调用与其自身互斥,唯一安全的方法就是。

最佳答案

接收方法永远不会被多个线程同时调用。驻留在 Actor 邮箱中的消息由 receive 方法一次处理一个。多个其他 Actor,或 ActorSystem 之外的功能,可以同时将消息排队到 Actor 的邮箱,但 ActorSystem 最终对消息进行排序。来自docs :

Enqueuing happens in the time-order of send operations, which means that messages sent from different actors may not have a defined order at runtime due to the apparent randomness of distributing actors across threads.

receive 方法的串行处理由您从未真正从 ActorSystem 获得 Actor 值(具有接收)这一事实来保证。相反,您只会得到一个没有接收方法的 ActorRef:

val actorSystem = akka.actor.ActorSystem()

//not an Actor but an ActorRef
val actorRef : ActorRef = actorSystem actorOf Props[FooCounter]

actorRef.receive(Foo) //COMPILE TIME ERROR!

“调用”接收方法的唯一方法是向 ActorRef 发送消息:

actorRef ! Foo //non-blocking, enqueues a Foo object in the mailbox

回到您的问题:ActorSystem 充当所有 Actor 实例的伪互斥锁。

因此,您的示例中的代码是绝对安全的,并且在任何给定时间只能通过一条消息访问状态。

关于akka - Akka Actor 执行是否互斥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33572421/

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