多进程工作者的全局定时器 替代单进程工作模式的erlangtimer
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
1.6 KiB

преди 3 години
преди 3 години
преди 3 години
преди 3 години
преди 3 години
преди 3 години
преди 3 години
преди 3 години
преди 3 години
преди 3 години
преди 3 години
преди 3 години
преди 3 години
преди 3 години
преди 3 години
преди 3 години
преди 3 години
преди 3 години
преди 3 години
преди 3 години
преди 3 години
  1. -module(gTimer).
  2. -include("gTimer.hrl").
  3. -export([
  4. start/0
  5. , stop/0
  6. , startWork/1
  7. , setTimer/2
  8. , setTimer/3
  9. , getTimer/1
  10. , delTimer/1
  11. ]).
  12. timerName(Idx) ->
  13. binary_to_atom(<<"$gtWSork_", (integer_to_binary(Idx))/binary>>).
  14. -spec startWork(Cnt :: non_neg_integer()) -> ok | {error, term()}.
  15. startWork(Cnt) when Cnt > 0 ->
  16. case ?gTimerCfg:getV(?workCnt) of
  17. 0 ->
  18. NameList = [{Idx, timerName(Idx)} || Idx <- lists:seq(1, Cnt)],
  19. [supervisor:start_child(gTimer_sup, [WorkName]) || {_Idx, WorkName} <- NameList],
  20. CfgList = [{?workCnt, Cnt} | NameList],
  21. gtKvsToBeam:load(?gTimerCfg, CfgList),
  22. ok;
  23. _Cnt ->
  24. {error, started}
  25. end.
  26. start() ->
  27. application:ensure_all_started(gTimer).
  28. stop() ->
  29. gtKvsToBeam:load(?gTimerCfg, [{?workCnt, 0}]),
  30. application:stop(gTimer).
  31. -spec setTimer(Time :: non_neg_integer(), MFA :: {module(), atom(), term()}) -> reference().
  32. setTimer(Time, MFA) ->
  33. Cnt = ?gTimerCfg:getV(?workCnt),
  34. Idx = rand:uniform(Cnt),
  35. erlang:start_timer(Time, ?gTimerCfg:getV(Idx), MFA).
  36. -spec setTimer(Time :: non_neg_integer(), MFA :: {module(), atom(), term()}, Strategy :: rand | bind) -> reference().
  37. setTimer(Time, MFA, Strategy) ->
  38. Cnt = ?gTimerCfg:getV(?workCnt),
  39. Idx = ?IIF(Strategy == rand, rand:uniform(Cnt), erlang:phash2(self(), Cnt) + 1),
  40. erlang:start_timer(Time, ?gTimerCfg:getV(Idx), MFA).
  41. -spec getTimer(TimerRef :: reference()) -> false | non_neg_integer().
  42. getTimer(TimerRef) ->
  43. erlang:read_timer(TimerRef).
  44. -spec delTimer(TimerRef :: reference()) -> false | non_neg_integer().
  45. delTimer(TimerRef) ->
  46. erlang:cancel_timer(TimerRef) .