У меня есть следующий код, который порождает множество рабочих актеров. Рабочий актор должен будет отправить сообщение диспетчеру задач, чтобы запросить дополнительные задачи, если он простаивает. Как актер себя идентифицирует?
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 для текущего актера. Вы также можете получить IActorRef актера, отправившего сообщение, которое вы в настоящее время обрабатываете, вызвав метод Sender в почтовом ящике. Вы можете использовать эти свойства для ответа отправителю, отправки сообщений самому себе или для отправки вашей собственной ссылки на актера другому субъекту, чтобы они могли отправлять вам сообщения.
Следует отметить, что вы должны давать каждому актеру уникальное имя при вызове 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 ()