演员如何识别自己?

How an actor identify itself?

我有下面的代码,它产生了许多工人演员。如果空闲,worker actor 将需要向任务调度程序发送消息以请求更多任务。演员如何识别自己?

let system = System.create "System" <| Configuration.load ()

let taskDispatcher (mailbox: Actor<_>) = .... // Send message to processor to assign tasks

let processor (mailbox: Actor<MyTask>) =
    let rec loop () = actor {
        // ... task done. send message to the dispatcher for a new task
        return! loop ()
    }
    loop ()

let processors = [
    spawn system "System" processor
    spawn system "System" processor
    spawn system "System" processor
    // .... many more
]

您调用的参数 mailbox(一个 Actor<'t>)有一个名为 Self 的 属性,它给您一个 IActorRef 到当前演员.您还可以通过调用邮箱上的 Sender 方法来获取发送您当前正在处理的消息的参与者的 IActorRef。您可以使用这些属性来回复发件人、向您自己发送消息,或者将您自己的演员参考发送给另一个演员,以便他们可以向您发送消息。

需要注意的一件事是,当您调用 spawn 时,您应该给每个演员一个唯一的名字。同一个演员系统中不能有两个同名的演员。

下面是使用这些属性的消息循环的简单示例:

type Msg = HelloFrom of IActorRef

spawn system "my-actor"
<| fun mailbox ->
    let rec loop () = 
        actor {
            let! message = mailbox.Receive()
            mailbox.Sender() <! HelloFrom mailbox.Self
            return! loop ()
        }
    loop ()