F# bounded worker pool collecting results
F#
open System.Threading
open System.Threading.Tasks
let runPool (workers: int) (jobs: (unit -> 'T) list) =
use gate = new SemaphoreSlim(workers)
let tasks =
jobs |> List.map (fun job ->
gate.Wait()
Task.Run(fun () ->
try
try Ok(job ()) with e -> Error e
finally
gate.Release()))
tasks |> List.map (fun t -> t.GetAwaiter().GetResult())