为什么 Akka.Net F# API 定义了 actorOf2 而不是 actorOf3、actorOf4 等?
Why does Akka.Net F# API define actorOf2 but not actorOf3, actorOf4 etc.?
我正在研究 F# Akka.Net API,它与对应的 C# 完全不同,因为它试图以惯用的方式公开 Akka 功能。所以它引入了一个计算表达式 actor 和几个辅助函数 actorOf 和 actorOf2:
let consoleWriterActor =
spawn myActorSystem "consoleWriterActor" (actorOf Actors.consoleWriterActor)
let consoleReaderActor =
spawn myActorSystem "consoleReaderActor" (actorOf2 (Actors.consoleReaderActor consoleWriterActor))
actorOf 可用于生成不依赖于其他 actor 的 actor,并且 actorOf2 允许发送另一个 actor 作为如上所示创建的演员的参数。
这很清楚,但我想知道只将一个演员作为参数有什么特别之处?定义 actorOf3、actorOf4 等是否有助于将多个 actor 参数发送到正在创建的 actor?例如,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 函数。
更新 感谢@Horusiath 的回答。我检查了 Akka.Net bootcamp(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))
actorOf2
没有发送任何演员作为参数。相反,它将参与者上下文公开给用户定义的函数。虽然对于简单的基于接收器的 actor 来说,它不是必需的 - 这里 actorOf
就足够了 - 它对于任何类型的更高级的工作都是必需的,比如生成子 actor、调度、订阅和发布消息。
我正在研究 F# Akka.Net API,它与对应的 C# 完全不同,因为它试图以惯用的方式公开 Akka 功能。所以它引入了一个计算表达式 actor 和几个辅助函数 actorOf 和 actorOf2:
let consoleWriterActor =
spawn myActorSystem "consoleWriterActor" (actorOf Actors.consoleWriterActor)
let consoleReaderActor =
spawn myActorSystem "consoleReaderActor" (actorOf2 (Actors.consoleReaderActor consoleWriterActor))
actorOf 可用于生成不依赖于其他 actor 的 actor,并且 actorOf2 允许发送另一个 actor 作为如上所示创建的演员的参数。
这很清楚,但我想知道只将一个演员作为参数有什么特别之处?定义 actorOf3、actorOf4 等是否有助于将多个 actor 参数发送到正在创建的 actor?例如,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 函数。
更新 感谢@Horusiath 的回答。我检查了 Akka.Net bootcamp(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))
actorOf2
没有发送任何演员作为参数。相反,它将参与者上下文公开给用户定义的函数。虽然对于简单的基于接收器的 actor 来说,它不是必需的 - 这里 actorOf
就足够了 - 它对于任何类型的更高级的工作都是必需的,比如生成子 actor、调度、订阅和发布消息。