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).