OxL Справочник OxL
РусскийEnglish

Акторы

actor владеет своим состоянием (var), которое доступно только из его msg. Сообщения обрабатываются по одному, в порядке поступления от каждого отправителя, поэтому блокировки не нужны (§8.8). spawn Session() создаёт локальный актор и возвращает ActorRef; вызов msg приостанавливается до ответа, а цепочка -> передаёт результат дальше.

oxl✓ проверяется в CI
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 активирует акторы локально:

oxl✓ проверяется в CI
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

См. также

OxL 1.0.0-beta · Версия документации 1.0.0-beta© OxwaldLink · сгенерировано из Стандарта, исходников std и руководства