erlang 中的高分辨率计时器




有谁知道是否可以在 Erlang 中制作高分辨率计时器?
根据文档,所有计时器和超时都以毫秒为单位。
需要以微秒为单位进行延迟。例如,而不是

timer:apply_after(MilliSec, Module, Function, Arguments).类似
的东西 timer:apply_after(MicroSec, Module, Function, Arguments).

事实上,所有计时器和超时原语都以毫秒为单位,包括:

  • receive...... after原语(这是模块最终依赖timer);
  • 依赖同一机制的erlang:send_after/3erlang:start_timer/3;
  • driver_set_timer链接驱动程序的功能。

可以考虑两种方法来实现亚毫秒级计时器:

  • 使用 Erlang 原语等待截断的毫秒数,然后使用繁忙循环进行调整。请注意,erlang:now()不是实时函数,因为它保证是单调的(而且这是相当昂贵的)。您应该改用os:timestamp();
  • 编写本机代码,生成一个线程,该线程将在计时器触发时发送消息。这可以很容易地实现为 NIF。
  1. 在实际应用中,如果需要定时器,应该使用 eralng:send_after/3 或 erlang:start_timer/3,而不是定时器模块。计时器模块使用计时器进程来实现定时器,如果应用程序有太多的定时器,它将阻塞定时器进程,这会减慢您的应用程序。
  2. erlang:send_after/3 和 erlang:start_timer/3 有一个区别。
    • erlang:start_timer/3 将在时间毫秒后将消息 {timeout, TimerRef, Msg} 发送到 Dest。 erlang:send_after/3 将在时间毫秒后仅将消息发送到 Dest。
    • 问题是当你需要取消计时器,并且消息已经发送时,如果你使用erlang:send_after/3,可能会导致逻辑句柄问题。

最新更新