5

我正在研究 F# Akka.Net API,它与 C# 对应物完全不同,因为它试图以惯用的方式公开 Akka 功能。所以它引入了一个计算表达式actor和几个辅助函数actorOfactorOf2

let consoleWriterActor = 
        spawn myActorSystem "consoleWriterActor" (actorOf Actors.consoleWriterActor)
let consoleReaderActor = 
        spawn myActorSystem "consoleReaderActor" (actorOf2 (Actors.consoleReaderActor consoleWriterActor))

actorOf对于生成不依赖于其他演员的演员很有用,并且actorOf2允许发送另一个演员作为正在创建的演员的参数,如上所示。

这很清楚,但我想知道仅将单个演员作为参数有什么特别之处?定义actorOf3actorOf4等是否有助于向正在创建的演员发送多个演员参数?例如,C# 泛型 Action<...> 宏具有最多 16 个动作参数的定义。定义几个actorOfX函数有意义吗?例如,来自 Akka.Net bootcamp 的使用验证操作的代码如下所示:

let consoleWriterActor = 
    spawn myActorSystem "consoleWriterActor" (actorOf Actors.consoleWriterActor)
let validationActor = 
    spawn myActorSystem "validationActor" (actorOf2 (Actors.validationActor consoleWriterActor))
let consoleReaderActor = 
    spawn myActorSystem "consoleReaderActor" (actorOf2 (Actors.consoleReaderActor validationActor))

你可以看到actor在链中相互引用:consoleReaderActor引用validationActor和validationActor引用consoleWriterActor。但是,如果我想让 consoleReaderActor 同时引用 validationActor 和 consoleWriterActor 怎么办?使用actorOf函数似乎不可能做到这一点。

更新感谢@Horsiath 的回答。我查看了 Akka.Net 训练营(F# 版本)中的一课,实际上可以在生成新演员时指定多个演员:

let a1 = 
    spawn myActorSystem "a1" (actorOf Actors.consoleWriterActor)
let a2 = 
    spawn myActorSystem "a2" (actorOf2 (Actors.consoleReaderActor consoleWriterActor))
let a2 = 
    spawn myActorSystem "a3" (actorOf2 (Actors.fileValidatorActor consoleWriterActor tailCoordinatorActor))
4

1 回答 1

3

actorOf2没有发送任何演员作为论据。相反,它将参与者上下文暴露给用户定义的函数。虽然对于简单的基于接收器的演员来说,这不是必需的——这里actorOf就足够了——任何更高级的工作都需要它,比如生成子演员、调度和订阅和发布消息。

于 2015-12-08T15:40:44.717 回答