Акторы
actor владеет своим состоянием (var), которое доступно только из его msg. Сообщения обрабатываются по одному, в порядке
поступления от каждого отправителя, поэтому блокировки не нужны (§8.8). spawn Session() создаёт локальный актор и
возвращает ActorRef; вызов msg приостанавливается до ответа, а цепочка -> передаёт результат дальше.
actor Session {
var total: i32 = 0
msg add(x: i32) {
print("add {x}")
total += x
}
msg sum() -> i32 {
total
}
}
fn show(n: i32) io {
print("total {n}")
}
fn main() io {
let s = spawn Session()
s.add(5) -> s.add(7) -> s.sum() -> show(it)
}Вывод
add 5 add 7 total 12
Шардированные акторы#
actor Account sharded by id: u64 — по экземпляру на ключ, распределённый по узлам ролей, которые объявили hosts Account
(шарды, перебалансировка, сохранение состояния — §12.4, §12.5). Вызов Account(1).deposit(5) работает так же, но
результат включает NetError: актор может быть на другом узле. На одном узле hosts активирует акторы локально:
actor Account sharded by id: u64 {
var balance: i64 = 0
msg deposit(x: i64) { balance += x }
msg get() -> i64 { balance }
}
cluster demo {
role all { hosts Account }
}
fn main() io, net {
Account(1).deposit(5)!
match Account(1).get() {
i64 n => print("{n}")
NetError e => print("net error")
}
}Вывод
5