<div dir="ltr">The timer module is often a performance problem, so avoiding that is a good idea (It's in the efficiency guide as well).<div><br></div><div>Gen server variants:</div><div><br></div><div>Model 1 will reset the timer if an event arrives. This means the timer will never trigger if events arrive before 1000ms each time (it'll starve the timeout message forever).</div><div><br></div><div>Model 2, seems a bit better to me.</div><div><br></div><div>Raw variants:</div><div><br></div><div>All models look fine to me.</div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Oct 31, 2017 at 11:55 AM Chaitanya Chalasani <<a href="mailto:cchalasani@me.com">cchalasani@me.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thank you Nathaniel, understood about the precision.<br>
<br>
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.<br>
<br>
> On 31-Oct-2017, at 4:46 AM, Nathaniel Waisbrot <<a href="mailto:nathaniel@waisbrot.net" target="_blank">nathaniel@waisbrot.net</a>> wrote:<br>
><br>
> Well for one, send_after/3 and send_interval/3 will produce slightly different timing.<br>
><br>
> Suppose your do_something/0 takes 50ms to run. Then in "Model 2", ignoring any complexities of scheduling, your function will be invoked at<br>
><br>
> t+1000, t+2050, t+3100, t+4150, t+5200, t+6250, ...<br>
><br>
> While "Model 3", under the same simplifying assumption would be invoked at<br>
><br>
> t+1000, t+2000, t+3000, t+4000, t+5000, t+6000, ...<br>
><br>
><br>
> To give you a few more choices:<br>
><br>
> - 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.<br>
> - 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<br>
> - When using gen_statem, you can give a timeouts like gen_server, but a wider variety of behavior is available<br>
><br>
><br>
><br>
>> On Oct 30, 2017, at 6:35 PM, Chaitanya Chalasani <<a href="mailto:cchalasani@me.com" target="_blank">cchalasani@me.com</a>> wrote:<br>
>><br>
>> Hi,<br>
>><br>
>> I have hundred’s of processes each running its own timers.<br>
>> I can think of the following models. Wanted to know the pros and cons of each model.<br>
>><br>
>> ** Model 1 **<br>
>> loop1(State) -><br>
>> receive<br>
>> after 1000 -><br>
>>     do_someting()<br>
>> end.<br>
>><br>
>> ** Model 2 **<br>
>> loop2(State) -><br>
>> erlang:send_after(1000, self(), timeout),<br>
>> receive<br>
>>   timeout -><br>
>>     do_someting(),<br>
>>     erlang:send_after(1000, self(), timeout)<br>
>> end.<br>
>><br>
>> ** Model 3 **<br>
>> loop3(State) -><br>
>> timer:send_interval(1000, self(), timeout),<br>
>> loop3a(State).<br>
>><br>
>> loop3a(State) -><br>
>> receive<br>
>>   timeout -><br>
>>     do_someting()<br>
>> end.<br>
>><br>
>> The above three models using the gen_server -<br>
>><br>
>> ** Model 1 **<br>
>> init(_Args) -><br>
>> {ok, State, 1000}.<br>
>><br>
>> handle_info(timeout, State) -><br>
>> do_someting(),<br>
>> {noreply, State, 1000}<br>
>><br>
>> ** Model 2 **<br>
>> init(_Args) -><br>
>> erlang:send_after(1000, self(), timeout),<br>
>> {ok, State}.<br>
>><br>
>> handle_info(timeout, State) -><br>
>> do_someting(),<br>
>> erlang:send_after(1000, self(), timeout),<br>
>> {noreply, State}<br>
>><br>
>> ** Model 3 **<br>
>> init(_Args) -><br>
>> timer:send_interval(1000, self(), timeout),<br>
>> {ok, State}.<br>
>><br>
>> handle_info(timeout, State) -><br>
>> do_someting(),<br>
>> {noreply, State}<br>
>><br>
>> /Chaitanya<br>
>> _______________________________________________<br>
>> erlang-questions mailing list<br>
>> <a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
>> <a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
><br>
<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div>