? , (MailboxProcessor ) , , . ( , ), , , . , parallelism. , , node, .
. , . . . " ", .. MailboxProcessor. , .
type Msg<'a, 'b> =
| Work of 'a
| Done of 'b
type MapTransformer(f) =
let results = ResizeArray()
let m = MailboxProcessor.Start(fun payload ->
let rec loop() =
async {
let! msg = payload.Receive()
match msg with
| Work work ->
results.Add(f work)
return! loop()
| Done (channel : AsyncReplyChannel<_>) ->
channel.Reply(results :> seq<_>)
}
loop())
member this.Enqueue(item) = m.Post(Work item)
member this.Results = m.PostAndReply(fun c -> Done c)
let uberMap tree =
let m = MapTransformer(fun x -> x + 1)
tree |> List.iter (fun x -> m.Enqueue(x))
m.Results
uberMap [1; 2; 3]
//outputs [2; 3; 4]