0

我有以下代码:

send_event_at({TsMsec,Msg}) -> 
    Now = os:system_time(micro_seconds),
    NowMsec = erlang:convert_time_unit(Now,micro_seconds,milli_seconds),
    DelayMsec = TsMsec - NowMsec,
    if DelayMsec >= 0  ->
            erlang:send_after(DelayMsec,self(),Msg);
      true -> ignore
end.

然后在 gen_fsm 我将这些消息处理为:

handle_info({new_status,{Status,HrQtKey}},StateName,State) ->
     .....
    {next_state,StateName,State};

用于发送延迟最多 48 小时的消息的代码。大多数时候一切都很好。

但是,如果我的 gen_fsm 有大量传入消息,则 new_status 消息最多会延迟 15 分钟。

这个错误出现的频率并不高,但确实很烦人。

并知道可能是什么原因以及解决它的最佳方法是什么?

4

1 回答 1

2

一些线索:

  • 您收到的时间是绝对时间,并且 erlang 中有很多时间源(请参阅Erlang 中的时间和时间校正),因此将 os:system_time 与 Erlang 单调时间结合起来存在风险,您应该注意TsMsec 参数的时间参考。
  • 在我看来,直接在参数中使用相对延迟应该更容易。
  • send_after 函数使用 Erlang 单调时间 - 从文档中不清楚它是使用绝对时间还是相对时间(尽管我认为它是绝对时间)。据说 Erlang Monitonic Time 精度取决于
    • OS单调时间的准确度和精度
    • OS系统时间的准确性和精度
    • 使用时间扭曲模式
于 2018-05-01T07:17:25.667 回答