码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-04-18 13:32:29      阅读:115      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!