OCaml bounded worker pool using Domain.spawn
OCaml
let run_pool ~workers tasks =
if workers < 1 then invalid_arg "run_pool: workers must be positive";
let tasks = Array.of_list tasks in
let next = Atomic.make 0 in
let worker () =
let rec loop acc =
let i = Atomic.fetch_and_add next 1 in
if i >= Array.length tasks then List.rev acc
else loop ((try Ok (tasks.(i) ()) with exn -> Error exn) :: acc)
in
loop []
in
List.init workers (fun _ -> Domain.spawn worker)
|> List.map Domain.join
|> List.concat