Spec-Zone.ru › OCaml

Модуль Domain

module Domain: sig .. end

Домены.

См. главу «Параллельное программирование» в руководстве.

  • С версии 5.0
  • Предупреждение: нестабильный интерфейс. Интерфейс Domain может измениться в будущем несовместимым образом.
type !'a t 

Домен типа 'a t работает независимо и в итоге возвращает результат типа 'a или исключение

val spawn : (unit -> 'a) -> 'a t

spawn f создаёт новый домен, работающий параллельно с текущим доменом.

  • Вызывает исключение Failure, если программе недостаточно ресурсов для создания ещё одного домена.
val join : 'a t -> 'a

join d блокирует выполнение, пока домен d не завершит работу. Если d возвращает значение, оно возвращается функцией join d. Если d вызывает необработанное исключение, оно повторно вызывается функцией join d.

Если домен создал какие-либо системные потоки (с помощью Thread.create), перед возвратом он пытается дождаться завершения этих потоков (как при вызове Thread.join).

type id = private int 

Домены имеют уникальные целочисленные идентификаторы

val get_id : 'a t -> id

get_id d возвращает идентификатор домена d

val self : unit -> id

self () — это идентификатор выполняющегося в данный момент домена

val before_first_spawn : (unit -> unit) -> unit

before_first_spawn f регистрирует f для вызова перед запуском программой первого домена. Функции, зарегистрированные с помощью before_first_spawn, вызываются в главном (начальном) домене. Функции, зарегистрированные с помощью before_first_spawn, вызываются в порядке «первым пришёл — первым вышел»: первой вызывается самая старая функция, добавленная с помощью before_first_spawn.

  • Вызывает исключение Invalid_argument, если программа уже запустила домен.
val at_exit : (unit -> unit) -> unit

at_exit f регистрирует f для вызова при завершении текущего домена. Обратите внимание, что обратные вызовы at_exit относятся к отдельному домену и применяются только к домену, в котором они были зарегистрированы. Зарегистрированные функции вызываются в порядке «последним пришёл — первым вышел»: первой вызывается функция, последней добавленная с помощью at_exit. Пример:

let temp_file_key = Domain.DLS.new_key (fun _ ->
  let tmp = snd (Filename.open_temp_file "" "") in
  Domain.at_exit (fun () -> close_out_noerr tmp);
  tmp)
    

Приведённый выше фрагмент создаёт ключ, при первом получении которого открывается временный файл и регистрируется обратный вызов at_exit для его закрытия. Это гарантирует, что дескриптор не будет утечкой ресурсов при завершении текущего домена.

val cpu_relax : unit -> unit

При активном ожидании вызов cpu_relax () между итерациями повысит производительность на некоторых архитектурах ЦП

val is_main_domain : unit -> bool

is_main_domain () возвращает true, если вызвана из начального домена.

val count : unit -> int

Количество запущенных доменов (включая начальный домен), которые ещё не завершили работу.

  • С версии 5.5
val recommended_domain_count : unit -> int

Рекомендуемое максимальное количество доменов, которые могут выполняться одновременно (включая уже запущенные домены).

Возвращаемое значение не меньше 1.

val self_index : unit -> int

Индекс текущего домена. Это целое число, уникальное среди доменов, выполняющихся в данный момент, из интервала 0; N-1, где N — максимальное количество доменов, одновременно выполнявшихся до настоящего момента.

Индекс завершившего работу домена может быть повторно использован новым доменом. Вместо этого используйте (Domain.self () :> int), чтобы получить идентификатор, уникальный среди всех доменов, когда-либо созданных программой.

  • С версии 5.3
module DLS: sig .. end

© 1995-2026 INRIA.
https://ocaml.org/manual/5.5/api/Domain.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API