1、把lists:foreach(Fun, List)分割成若干个进程均分处理,默认分成10个进程
%% @doc 把lists:foreach(Fun, List) 函数分割成若干个进程平均处理,默认分割成10个进程
-spec foreach_split(Fun, ObjList) -> ok when
Fun :: function(),
ObjList :: [term()].
foreach_split(Fun, ObjList) ->
foreach_split(Fun, ObjList, 10).
foreach_split(Fun, ObjList, SplitNum) ->
Len = length(ObjList),
SplitObjList =
case Len =< SplitNum of
true ->
list_util:unappend(ObjList);
false ->
AveNum = Len div SplitNum,
lists:foldl(
fun(N, {Acc, Tail}) when N == SplitNum ->
[Tail|Acc];
(_N, {Acc, Tail}) ->
{Head, NewTail} = lists:split(AveNum, Tail),
{[Head|Acc], NewTail}
end, {[], ObjList}, lists:seq(1, SplitNum))
end,
spawn(fun() ->
Self = self(),
%% Before = os:timestamp(),
lists:foreach(fun(SplitObjList1) ->
Ref = erlang:make_ref(),
spawn(fun() ->
[Fun(Obj) || Obj <- SplitObjList1],
Self ! {ok,Ref}
end),
Refs = case get(refs) /= undefined of true -> get(refs); false -> [] end,
put(refs, [Ref|Refs])
end, SplitObjList),
ok = loop(get(refs)),
%% After = os:timestamp(),
%% T = timer:now_diff(After, Before),
%% ?WARNING_MSG(“并发测试 microsecs =pn”,[T]),
ok
end),
ok.
目的:提高foreach处理效率
erlang的list函数优化
最新推荐文章于 2024-05-23 09:31:39 发布