首页 > 其他 > 详细

修改本机的系统时间对send_after的影响

时间:2016-04-18 13:30:39      阅读:223      评论:0      收藏:0      [点我收藏+]

前几天写了一个系统, 在本机自测时,为了测试方便,修改了本机的系统时间(将时间向未来调),但是随后,出现了诡异的bug,费了一段时间后,才发现原因:

修改系统时间之前,原本是每分钟触发一次的逻辑,在修改了系统时间后,每分钟可能会触发一次,但也可能会触发两次!

通过调试打印信息,发现当某分钟内触发两次时,是有规律的,一次是在该分钟的0秒,另一次是在该分钟的59秒。

 

程序的逻辑很简单,就是一个gen_server的模块,在init()时, 调用schedule_loop(),预定一个下一分钟的loop消息,在收到loop消息后,调用schedule_loop()以再次预定一个下一分钟的loop消息,并做相应处理,依此循环下去。

如下是schedule_loop()的实现:

schedule_loop() ->
    {_Hour, _Min, Sec} = erlang:time(),
    Intv =  60 - Sec,
    erlang:send_after(Intv*1000, self(), loop).

如下是收到loop消息对应的处理函数:

handle_info(loop, State) ->
    schedule_loop(),
    loop_handle(),
    {noreply, State};

 

修改系统时间为什么会产生这种影响? erlang:send_after()的实现原理是如何的? 目前还不清楚,以后有时间再研究下底层,这里先mark一下,以后得留心!

 

  

  

修改本机的系统时间对send_after的影响

原文:http://www.cnblogs.com/kamfon/p/5403926.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!