演员如何识别自己?
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 ()
我有下面的代码,它产生了许多工人演员。如果空闲,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 ()