[erlang-questions] Timer implementation models
Nathaniel Waisbrot
nathaniel@REDACTED
Tue Oct 31 00:16:07 CET 2017
Well for one, send_after/3 and send_interval/3 will produce slightly different timing.
Suppose your do_something/0 takes 50ms to run. Then in "Model 2", ignoring any complexities of scheduling, your function will be invoked at
t+1000, t+2050, t+3100, t+4150, t+5200, t+6250, ...
While "Model 3", under the same simplifying assumption would be invoked at
t+1000, t+2000, t+3000, t+4000, t+5000, t+6000, ...
To give you a few more choices:
- When using gen_server, I prefer to call timer:apply_after/4 and timer:apply_interval/4. I either have them call gen_server:cast/2 or a local function that calls cast.
- When using gen_server, you can give a timeout in your callback response. This works quite differently from the timer module, but might be useful for some things
- When using gen_statem, you can give a timeouts like gen_server, but a wider variety of behavior is available
> On Oct 30, 2017, at 6:35 PM, Chaitanya Chalasani <cchalasani@REDACTED> wrote:
>
> Hi,
>
> I have hundred’s of processes each running its own timers.
> I can think of the following models. Wanted to know the pros and cons of each model.
>
> ** Model 1 **
> loop1(State) ->
> receive
> after 1000 ->
> do_someting()
> end.
>
> ** Model 2 **
> loop2(State) ->
> erlang:send_after(1000, self(), timeout),
> receive
> timeout ->
> do_someting(),
> erlang:send_after(1000, self(), timeout)
> end.
>
> ** Model 3 **
> loop3(State) ->
> timer:send_interval(1000, self(), timeout),
> loop3a(State).
>
> loop3a(State) ->
> receive
> timeout ->
> do_someting()
> end.
>
> The above three models using the gen_server -
>
> ** Model 1 **
> init(_Args) ->
> {ok, State, 1000}.
>
> handle_info(timeout, State) ->
> do_someting(),
> {noreply, State, 1000}
>
> ** Model 2 **
> init(_Args) ->
> erlang:send_after(1000, self(), timeout),
> {ok, State}.
>
> handle_info(timeout, State) ->
> do_someting(),
> erlang:send_after(1000, self(), timeout),
> {noreply, State}
>
> ** Model 3 **
> init(_Args) ->
> timer:send_interval(1000, self(), timeout),
> {ok, State}.
>
> handle_info(timeout, State) ->
> do_someting(),
> {noreply, State}
>
> /Chaitanya
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
More information about the erlang-questions
mailing list