module Domain: Domain
網域(Domains)。
請參閱手冊中的「平行程式設計」章節。
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
重新引發。
typeid = 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 () 將會改善某些 CPU 架構的效能。
val is_main_domain : unit -> bool
is_main_domain ()
如果是從初始網域呼叫,則返回 true。
val recommended_domain_count : unit -> int
建議同時執行的最大網域數(包括已經在執行的網域)。
返回的值至少為 1
。
module DLS:sig
..end