erlang:send_after消息延迟

时间:2018-04-30 23:09:37

标签: erlang gen-fsm

我有以下代码:

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分钟。

这个错误不常出现,但实在令人讨厌。

想出可能是什么原因以及解决问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

一些线索:

  • 你收到的时间是一个绝对的时间,erlang中有很多时间源(见Time and Time Correction in Erlang),所以将os:system_time与Erlang Monotonic Time结合起来存在风险,你应该知道TsMsec参数的时间参考。
  • 在我看来,直接在参数中使用相对延迟会更容易。
  • send_after函数使用Erlang单调时间 - 从文档中不清楚它是否以绝对或相对时间工作(虽然我认为这是绝对时间)。据说Erlang Monitonic Time的准确度取决于
    • OS单调时间的准确性和精确度
    • OS系统时间的准确性和精确度
    • 时间扭曲模式