Browse Source

ft: 添加定时函数执行的策略

master
SisMaker 1 year ago
parent
commit
e37b00b221
3 changed files with 42 additions and 30 deletions
  1. +2
    -1
      README.md
  2. +12
    -5
      src/gTimer.erl
  3. +28
    -24
      src/timerWork/gtWork.erl

+ 2
- 1
README.md View File

@ -12,6 +12,7 @@ Useage
-----
startWork/1 开启指定数量的定时器工作者
setTimer/2 随机一个定时器工作者然后设置定时器
setTimer/3 指定选择定时器工作者策略然后设置定时器
setTimer/3 指定选择定时器工作者策略然后设置定时器
setTimer/4 指定选择定时器工作者策略然后设置定时器 并指定执行的函数在定时器的进程 还是新spawn一个进程执行函数(一般来说轻度的函数可以就在定时器进程执行, 重度函数就新开一个进程执行)
getTimer/1 获取定时器的信息
delTimer/1 删除一个定时器

+ 12
- 5
src/gTimer.erl View File

@ -8,6 +8,7 @@
, startWork/1
, setTimer/2
, setTimer/3
, setTimer/4
, getTimer/1
, asyncDelTimer/1
, syncDelTimer/1
@ -40,13 +41,19 @@ stop() ->
setTimer(Time, MFA) ->
Cnt = ?gTimerCfg:getV(?workCnt),
Idx = rand:uniform(Cnt),
erlang:start_timer(Time, ?gTimerCfg:getV(Idx), MFA).
erlang:start_timer(Time, ?gTimerCfg:getV(Idx), {newSpawn, MFA}).
-spec setTimer(Time :: non_neg_integer(), MFA :: {module(), atom(), term()}, Strategy :: rand | bind) -> reference().
setTimer(Time, MFA, Strategy) ->
-spec setTimer(Time :: non_neg_integer(), MFA :: {module(), atom(), term()}, ChoseStrategy :: rand | bind) -> reference().
setTimer(Time, MFA, ChoseStrategy) ->
Cnt = ?gTimerCfg:getV(?workCnt),
Idx = ?CASE(Strategy == rand, rand:uniform(Cnt), erlang:phash2(self(), Cnt) + 1),
erlang:start_timer(Time, ?gTimerCfg:getV(Idx), MFA).
Idx = ?CASE(ChoseStrategy == rand, rand:uniform(Cnt), erlang:phash2(self(), Cnt) + 1),
erlang:start_timer(Time, ?gTimerCfg:getV(Idx), {newSpawn, MFA}).
-spec setTimer(Time :: non_neg_integer(), MFA :: {module(), atom(), term()}, ChoseStrategy :: rand | bind, WorkStrategy :: newSpawn | curApply) -> reference().
setTimer(Time, MFA, ChoseStrategy, WorkStrategy) ->
Cnt = ?gTimerCfg:getV(?workCnt),
Idx = ?CASE(ChoseStrategy == rand, rand:uniform(Cnt), erlang:phash2(self(), Cnt) + 1),
erlang:start_timer(Time, ?gTimerCfg:getV(Idx), {WorkStrategy, MFA}).
-spec getTimer(TimerRef :: reference()) -> false | non_neg_integer().
getTimer(TimerRef) ->

+ 28
- 24
src/timerWork/gtWork.erl View File

@ -3,52 +3,56 @@
-behavior(gen_srv).
-export([
start_link/1
start_link/1
]).
-export([
init/1
, handleCall/3
, handleCast/2
, handleInfo/2
, terminate/2
, code_change/3
init/1
, handleCall/3
, handleCast/2
, handleInfo/2
, terminate/2
, code_change/3
]).
-record(state, {}).
%% ******************************************** API *******************************************************************
start_link(SrvName) ->
gen_srv:start_link({local, SrvName}, ?MODULE, [], []).
gen_srv:start_link({local, SrvName}, ?MODULE, [], []).
%% ******************************************** callback **************************************************************
init(_Args) ->
{ok, #state{}}.
{ok, #state{}}.
handleCall(_Msg, _State, _FROM) ->
{reply, ok}.
{reply, ok}.
%%
handleCast(_Msg, _State) ->
kpS.
handleInfo({timeout, TimerRef, MFA}, _State) ->
%% Msg格式
{M, F, A} = MFA,
spawn(M, F, [A, TimerRef]),
% 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;
kpS.
handleInfo({timeout, TimerRef, {WorkStrategy, MFA}}, _State) ->
%% Msg格式
{M, F, A} = MFA,
case WorkStrategy of
newSpawn ->
spawn(M, F, [A, TimerRef]);
_ ->
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
end,
kpS;
handleInfo(_Msg, _State) ->
kpS.
kpS.
terminate(_Reason, _State) ->
ok.
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
{ok, State}.
%% ****************************************************** logic ********************************************************

Loading…
Cancel
Save