diff --git a/src/rank/rankTest.erl b/src/rank/rankTest.erl index 359bd42..e0a7d99 100644 --- a/src/rank/rankTest.erl +++ b/src/rank/rankTest.erl @@ -5,7 +5,7 @@ -include("ranks.hrl"). -export([ - start_link/2 + start_link/3 , start/3 ]). @@ -19,26 +19,40 @@ ]). start(Cnt, Num, Limit) -> - ranks:startWork(4) , + io:format("start test ~p ~p ~p ~n", [Cnt, Num, erlang:system_time(second)]), + ranks:startWork(erlang:system_info(schedulers)) , [ranks:initRank(RankType, ceil(Limit * 0.6), Limit) || RankType <- ?AllRankType], - doTest(Cnt, Num). + doTest(Cnt, Num), + doWait(Cnt, 0). doTest(0, _) -> ok; doTest(Cnt, Num) -> - start_link(Cnt, Num), + start_link(self(), Cnt, Num), doTest(Cnt - 1, Num). --record(state, {id, num}). +doWait(Cnt, Sum) -> + receive + over -> + if Cnt == Sum + 1 -> + io:format("end test ~p ~p ~n", [Cnt, erlang:system_time(second)]); + true -> + % io:format("doWait test ~p ~p ~n", [Cnt, Sum + 1]), + doWait(Cnt, Sum + 1) + end + + end. + +-record(state, {parent, id, num}). %% ******************************************** API ******************************************************************* -start_link(Id, Num) -> - gen_srv:start_link(?MODULE, {Id, Num}, []). +start_link(Parent, Id, Num) -> + gen_srv:start(?MODULE, {Parent, Id, Num}, []). %% ******************************************** callback ************************************************************** -init({Id, Num}) -> +init({Parent, Id, Num}) -> ranks:updateInfo(Id, {?publicInfoPos, {Id, Num, self()}}), - {ok, #state{id = Id, num = Num}, 0}. + {ok, #state{parent = Parent, id = Id, num = Num}, 0}. handleCall(_Msg, _State, _FROM) -> {reply, ok}. @@ -46,18 +60,10 @@ handleCall(_Msg, _State, _FROM) -> handleCast(_Msg, _State) -> kpS. -handleInfo(timeout, #state{id = Id, num = Num} = State) -> - RankType = lists:nth(rand:uniform(3), ?AllRankType), - Score = rand:uniform(10000), - ranks:updateScore(RankType, Id, {Score, Id}), - NewNum = Num - 1, - case NewNum < 0 of - true -> - io:format("test over ~p~n", [Id]), - {stop, normal, State}; - _ -> - {noreply, State#state{num = NewNum}, 0} - end; +handleInfo(timeout, #state{parent = Parent, id = Id, num = Num} = State) -> + loopScore(Num, Id), + Parent ! over, + {stop, normal, State}; handleInfo(_Msg, _State) -> kpS. @@ -67,4 +73,12 @@ terminate(_Reason, _State) -> code_change(_OldVsn, State, _Extra) -> {ok, State}. %% ****************************************************** logic ******************************************************** +loopScore(0, _Id) -> + ok; +loopScore(Num, Id) -> + RankType = lists:nth(rand:uniform(3), ?AllRankType), + Score = rand:uniform(10000), + ranks:updateScore(RankType, Id, {Score, Id}), + loopScore(Num - 1, Id). + diff --git a/src/ranks.erl b/src/ranks.erl index c88d801..e907e2d 100644 --- a/src/ranks.erl +++ b/src/ranks.erl @@ -7,7 +7,7 @@ , stop/0 , startWork/1 %% 创建指定数量的排行榜工作者 , initRank/3 %% 创建新的类型排行榜 - , updateScore/3 %% 更新某类型的排行榜分数 + , updateScore/3 %% 更新某类型的排行榜分数 todo 这里可能差个第一次插入的接口函数 , updateInfo/2 %% 更新公共信息 , getRankInfo/5 %% 获取排行某页的信息 ]).