【问题标题】:How to create a child actor in akka.net using F#?如何使用 F# 在 akka.net 中创建子演员?
【发布时间】:2021-10-09 09:03:42
【问题描述】:

我有两个演员 - childActor 和 parentActor

open System
open Akka
open Akka.FSharp

let systemActor = System.create "systemActor" <| Configuration.defaultConfig()

let childActor (mailbox: Actor<_>) = 
    let rec loop() = actor {
        let! message = mailbox.Receive()
        printfn "Message received"
        return! loop()
    }
    loop()

let parentActor (mailbox: Actor<_>) = 
    let rec loop() = actor {
        let! message = mailbox.Receive()
        printfn "Message received"
        return! loop()
    }
    loop()

我可以使用 spawn 函数创建父actor引用。

let parentRef = spawn systemActor "parentActor" parentActor

现在我要做的是在父actor下创建子actor引用。如下所示。

let childRef = spawn parentRef "childActor" childActor

但这不起作用。 spawn 函数需要 IActorRefFactory 类型的参数,因此它不接受 IActorRef。有什么方法可以在akka.net中使用F#在父actor下创建子actor?

【问题讨论】:

    标签: f# akka akka.net actor-model


    【解决方案1】:

    IActorRefFactory 是一个负责确定父级的接口,在 Akka.FSharp 的情况下,它也由ActorSystemActor&lt;_&gt; 实现。所以在你的情况下,只需使用:

    let childRef = spawn mailbox "childActor" childActor
    

    【讨论】:

    • 为了清楚起见,这行代码必须添加到parentActor 函数中,对吗?否则,不清楚父子关系是如何创建的。
    • 是的,因为第一个 spawn 参数指定了父级。如果您将传递当前演员的mailbox,则该演员将被视为父母。如果你传递ActorSystem,这意味着这个系统的/useractor 将成为父actor - /user 是一个特殊的根actor,在actor系统启动时隐式创建。
    猜你喜欢
    • 1970-01-01
    • 2015-05-10
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2019-11-11
    • 2021-02-11
    相关资源
    最近更新 更多