Просмотр исходного кода

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

master
SisMaker 3 лет назад
Родитель
Сommit
9954115508
2 измененных файлов: 12 добавлений и 3 удалений
  1. +4
    -1
      include/gTimer.hrl
  2. +8
    -2
      src/gTimer.erl

+ 4
- 1
include/gTimer.hrl Просмотреть файл

@ -2,4 +2,7 @@
-define(gTimerCfg, gTimerCfg). -define(gTimerCfg, gTimerCfg).
%% %%
-define(workCnt, workCnt).
-define(workCnt, workCnt).
%%
-define(IIF(Cond, Ret1, Ret2), (case Cond of true -> Ret1; _ -> Ret2 end)).

+ 8
- 2
src/gTimer.erl Просмотреть файл

@ -7,6 +7,7 @@
, stop/0 , stop/0
, startWork/1 , startWork/1
, setTimer/2 , setTimer/2
, setTimer/3
, getTimer/1 , getTimer/1
, delTimer/1 , delTimer/1
]). ]).
@ -37,14 +38,19 @@ stop() ->
setTimer(Time, Msg) -> setTimer(Time, Msg) ->
Cnt = ?gTimerCfg:getV(?workCnt), Cnt = ?gTimerCfg:getV(?workCnt),
Idx = erlang:phash2(self(), Cnt) + 1,
Idx = rand:uniform(Cnt),
erlang:start_timer(Time, ?gTimerCfg:getV(Idx), Msg).
setTimer(Time, Msg, 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), Msg).
getTimer(TimerRef) -> getTimer(TimerRef) ->
erlang:read_timer(TimerRef). erlang:read_timer(TimerRef).
delTimer(TimerRef) -> delTimer(TimerRef) ->
erlang:cancel_timer(TimerRef).
erlang:cancel_timer(TimerRef) .

Загрузка…
Отмена
Сохранить