erlang: задержка отправки сообщения - PullRequest
0 голосов
/ 01 мая 2018

У меня есть следующий код:

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 голосов
/ 01 мая 2018

Некоторые подсказки:

  • Время, которое вы получаете, является абсолютным, и в эрланге есть много источников времени (см. Коррекция времени и времени в Эрланге ), поэтому существует риск объединения os: system_time с монотонным Erlang. Время, и вы должны знать о временной привязке для параметра TsMsec.
  • На мой взгляд, проще использовать относительную задержку непосредственно в вашем параметре.
  • Функция send_after использует монотонное время Эрланга - из документации неясно, будет ли оно работать с абсолютным или относительным временем (хотя я думаю, что это абсолютное время). Говорят, что точность Erlang Monitonic Time зависит от
    • Точность и точность ОС монотонного времени
    • Точность и точность системного времени ОС
    • используется режим временной деформации
...