Erlang bounded worker pool collecting results
Erlang
-module(worker_pool).
-export([run/2]).
run(Tasks, Size) when Size > 0 -> run(Tasks, Size, []).
run([], _Size, Acc) -> lists:reverse(Acc);
run(Tasks, Size, Acc) ->
{Batch, Rest} = split(Tasks, Size),
run(Rest, Size, lists:reverse(pmap(Batch), Acc)).
pmap(Funs) ->
Parent = self(),
Refs = [begin Ref = make_ref(),
spawn_link(fun() -> Parent ! {Ref, (catch F())} end),
Ref
end || F <- Funs],
[receive {Ref, R} -> R after 30000 -> {error, timeout} end || Ref <- Refs].
split(L, N) when length(L) =< N -> {L, []};
split(L, N) -> lists:split(N, L).