[erlang-questions] Timer implementation models
Chaitanya Chalasani
cchalasani@REDACTED
Tue Oct 31 11:55:32 CET 2017
Thank you Nathaniel, understood about the precision.
If precision isn’t my criteria and considering 100s to 1000s of timers running concurrently, is there any advantage for the model 2 over model 3.
> On 31-Oct-2017, at 4:46 AM, Nathaniel Waisbrot <nathaniel@REDACTED> wrote:
>
> 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