Ты в порядке;необработанные сообщения в актере будут просто помещаться в почтовый ящик и обрабатываться, когда актер будет готов к ним.Однако, что касается актеров, отвечающих на своих абонентов, вам обычно не нужно передавать ссылку на this
, потому что актеры могут напрямую общаться с вызывающим абонентом с помощью reply
.Вот простой пример:
class MyActor(n: Int) extends Actor {
def act() {
loop {
react {
case m: Int => reply(n + m) // Use `reply` to reply to caller
}
}
}
}
// new MyActor(0), new MyActor(10), new MyActor(20), ...
val actors = (0 to 100 by 10) map (new MyActor(_).start())
// Message each actor with '5', expecting a response (that's what `!?` does)
val responses = actors map (_ !? 5)
responses foreach println
приводит к
5
15
25
35
45
55
65
75
85
95
105
Оператор !?
, однако, будет блокировать основной поток, пока мы не получим ответ на его сообщение.В результате, actors map (_ !? 5)
на самом деле не так уж и параллелен.Вместо этого вы можете использовать !!
для генерации фьючерсов (которые вы тем временем можете позволить вычислить и отложить оценку до готовности).Итак ... изменение этих двух последних строк на
val futures = actors map (_ !! 5)
futures foreach (future => println(future()))
сообщит первому актеру «5», давая мне будущее, за которое он должен удержаться, а затем сообщит второму актеру «5»', давая мне будущее, которое нужно удержать в то же время и т. д., и когда мы будем готовы, мы можем оценить будущее (future()
) и каким-то образом использовать его результат (например, распечатать его).