Преглед изворни кода

ft: 多工作者的全局定时器

master
SisMaker пре 3 година
родитељ
комит
cc9a920d31
3 измењених фајлова са 30 додато и 30 уклоњено
  1. +11
    -15
      src/gTimer.erl
  2. +13
    -13
      src/gTimer_sup.erl
  3. +6
    -2
      src/timer/gtWork.erl

+ 11
- 15
src/gTimer.erl Прегледај датотеку

@ -12,11 +12,10 @@
, delTimer/1
]).
timerName(Idx) ->
binary_to_atom(<<"$gtWSork_", (integer_to_binary(Idx))/binary>>).
-spec startWork(Cnt :: non_neg_integer()) -> ok | {error, term()}.
startWork(Cnt) when Cnt > 0 ->
case ?gTimerCfg:getV(?workCnt) of
0 ->
@ -24,7 +23,7 @@ startWork(Cnt) when Cnt > 0 ->
[supervisor:start_child(gTimer_sup, [WorkName]) || {_Idx, WorkName} <- NameList],
CfgList = [{?workCnt, Cnt} | NameList],
gtKvsToBeam:load(?gTimerCfg, CfgList),
ok1;
ok;
_Cnt ->
{error, started}
end.
@ -36,25 +35,22 @@ stop() ->
gtKvsToBeam:load(?gTimerCfg, [{?workCnt, 0}]),
application:stop(gTimer).
setTimer(Time, Msg) ->
-spec setTimer(Time :: non_neg_integer(), MFA :: {module(), atom(), term()}) -> reference().
setTimer(Time, MFA) ->
Cnt = ?gTimerCfg:getV(?workCnt),
Idx = rand:uniform(Cnt),
erlang:start_timer(Time, ?gTimerCfg:getV(Idx), Msg).
erlang:start_timer(Time, ?gTimerCfg:getV(Idx), MFA).
setTimer(Time, Msg, Strategy) ->
-spec setTimer(Time :: non_neg_integer(), MFA :: {module(), atom(), term()}, Strategy :: rand | bind) -> reference().
setTimer(Time, MFA, Strategy) ->
Cnt = ?gTimerCfg:getV(?workCnt),
Idx = ?IIF(Strategy == rand, rand:uniform(Cnt), erlang:phash2(self(), Cnt) + 1),
erlang:start_timer(Time, ?gTimerCfg:getV(Idx), Msg).
erlang:start_timer(Time, ?gTimerCfg:getV(Idx), MFA).
-spec getTimer(TimerRef :: reference()) -> false | non_neg_integer().
getTimer(TimerRef) ->
erlang:read_timer(TimerRef).
-spec delTimer(TimerRef :: reference()) -> false | non_neg_integer().
delTimer(TimerRef) ->
erlang:cancel_timer(TimerRef) .
erlang:cancel_timer(TimerRef) .

+ 13
- 13
src/gTimer_sup.erl Прегледај датотеку

@ -11,17 +11,17 @@
start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
init([]) ->
SupFlags = #{strategy => simple_one_for_one, intensity => 1000, period => 3600},
ChildSpecs = [
#{
id => gtWork,
start => {gtWork, start_link, []},
restart => permanent,
shutdown => 3000,
type => worker,
modules => [gtWork]
}
],
{ok, {SupFlags, ChildSpecs}}.
init(_) ->
SupFlags = #{strategy => simple_one_for_one, intensity => 1000, period => 3600},
ChildSpecs = [
#{
id => gtWork,
start => {gtWork, start_link, []},
restart => permanent,
shutdown => 3000,
type => worker,
modules => [gtWork]
}
],
{ok, {SupFlags, ChildSpecs}}.

+ 6
- 2
src/timer/gtWork.erl Прегледај датотеку

@ -32,9 +32,13 @@ handleCall(_Msg, _State, _FROM) ->
handleCast(_Msg, _State) ->
kpS.
handleInfo({timeout, TimerRef, Msg}, _State) ->
handleInfo({timeout, TimerRef, MFA}, _State) ->
%% Msg格式
io:format("the timer time out ~p ~p ~n", [TimerRef, Msg]),
{M, F, A} = MFA,
try M:F(A, TimerRef)
catch C:R ->
error_logger:error_msg("gTimer timeout error MFA:~p C:~p R:~p~n", [MFA, C, R])
end,
kpS;
handleInfo(_Msg, _State) ->
kpS.

Loading…
Откажи
Сачувај