Vag*_*lov 5 f# actor-model akka.net
我正在研究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))
Run Code Online (Sandbox Code Playgroud)
所述actorOf是有用产卵不依赖于额外的行动者演员,和actorOf2允许发送另一个演员作为正在创建的演员的参数,如上所示.
这很清楚,但我想知道将一个演员作为参数是多么特别?不定义actorOf3,actorOf4等有助于将多个actor参数发送给正在创建的actor吗?例如,C#generic 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))
Run Code Online (Sandbox Code Playgroud)
您可以看到actor在链中相互引用:consoleReaderActor引用validationActor和validationActor引用consoleWriterActor.但是如果我想让consoleReaderActor同时引用validationActor和consoleWriterActor呢?使用actorOf函数看起来不太可能.
更新感谢@Horusiath的回答.我查看了Akka.Net bootcamp(F#版本)中的一个课程,实际上可以在生成一个新的actor时指定多个actor:
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))
Run Code Online (Sandbox Code Playgroud)
actorOf2不发送任何演员作为参数。相反,它将参与者上下文暴露给用户定义的函数。虽然对于简单的基于接收器的 Actor 来说,这是不必要的 - 这里actorOf就足够了 - 任何更高级的工作都需要它,例如生成子 Actor、调度、订阅和发布消息。