|
25 | 25 | name, |
26 | 26 | supervisor, |
27 | 27 | size, |
| 28 | + delay, |
| 29 | + delay_timers, |
28 | 30 | workers |
29 | 31 | }). |
30 | 32 |
|
@@ -65,13 +67,18 @@ start_link(Name, PoolArgs, WorkerArgs) -> |
65 | 67 | ignore. |
66 | 68 | init({Name,PoolArgs, WorkerArgs})-> |
67 | 69 | process_flag(trap_exit, true), |
68 | | - init(PoolArgs,WorkerArgs,#state{name = Name}). |
| 70 | + init(PoolArgs,WorkerArgs,#state{ |
| 71 | + name = Name, delay = 0, |
| 72 | + delay_timers = undefined |
| 73 | + }). |
69 | 74 | init([{worker_module, Mod} | Rest], WorkerArgs, #state{name = Name} = State) when is_atom(Mod) -> |
70 | 75 | %% 该进程挂了,会将所有进程全部挂掉 |
71 | 76 | {ok, Sup} = ai_balance_worker_sup:start_link(Name, Mod,WorkerArgs), |
72 | 77 | init(Rest, WorkerArgs, State#state{supervisor = Sup}); |
73 | 78 | init([{size, Size} | Rest], WorkerArgs, State) when is_integer(Size) -> |
74 | 79 | init(Rest, WorkerArgs, State#state{size = Size}); |
| 80 | +init([{delay,Delay} | Rest], WorkerArgs, State) when is_integer(Delay) -> |
| 81 | + init(Rest, WorkerArgs, State#state{delay = Delay, delay_timers = []}); |
75 | 82 | init([_ | Rest], WorkerArgs, State) -> |
76 | 83 | init(Rest, WorkerArgs, State); |
77 | 84 | init([], _WorkerArgs, #state{size = Size, supervisor = Sup} = State) -> |
@@ -122,15 +129,28 @@ handle_cast(_Request, State) -> |
122 | 129 | {noreply, NewState :: term(), hibernate} | |
123 | 130 | {stop, Reason :: normal | term(), NewState :: term()}. |
124 | 131 |
|
125 | | -handle_info({'EXIT', Pid, _Reason}, #state{supervisor = Sup} = State) -> |
| 132 | +handle_info({'EXIT', Pid, _Reason}, #state{supervisor = Sup, delay = 0, workers = Workers} = State) -> |
126 | 133 | case lists:member(Pid, State#state.workers) of |
127 | 134 | true -> |
128 | | - W = lists:filter(fun (P) -> P =/= Pid end, State#state.workers), |
| 135 | + W = lists:filter(fun (P) -> P =/= Pid end, Workers), |
129 | 136 | {noreply, State#state{workers = [new_worker(Sup) | W]}}; |
130 | 137 | false -> |
131 | 138 | {noreply, State} |
132 | 139 | end; |
133 | | - |
| 140 | +handle_info({'EXIT', Pid, _Reason}, #state{delay = Delay, delay_timers = Timers, |
| 141 | + workers = Workers} = State)-> |
| 142 | + case lists:member(Pid, State#state.workers) of |
| 143 | + true -> |
| 144 | + W = lists:filter(fun (P) -> P =/= Pid end, Workers), |
| 145 | + Timer = ai_timer:start(Delay,new_worker,ai_timer:new([async])), |
| 146 | + {noreply, State#state{workers = W, delay_timers = [Timer | Timers]}}; |
| 147 | + false -> |
| 148 | + {noreply, State} |
| 149 | + end; |
| 150 | +handle_info({timeout,TimerRef,new_worker},#state{supervisor = Sup, delay_timers = Timers, |
| 151 | + workers = Workers} = State)-> |
| 152 | + Timers1 = lists:filter(fun(T)-> ai_timer:is_current(TimerRef,T) =/= true end,Timers), |
| 153 | + {noreply, State#state{workers = [new_worker(Sup)| Workers], delay_timers = Timers1}}; |
134 | 154 | handle_info(_Info, State) -> |
135 | 155 | {noreply, State}. |
136 | 156 |
|
|
0 commit comments