在erlang中的高分辨率计时器

时间:2013-09-27 11:29:34

标签: timer erlang


有人知道是否可以在Erlang中制作高分辨率计时器?
根据文档记录,所有计时器和超时都以毫秒为单位 需要在几微秒内进行延迟。例如,而不是
timer:apply_after(MilliSec, Module, Function, Arguments).
类似的东西 timer:apply_after(MicroSec, Module, Function, Arguments).

2 个答案:

答案 0 :(得分:3)

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

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

  • 使用Erlang基元等待截断的毫秒数,然后使用忙循环进行调整。请注意erlang:now()不是实时功能,因为它保证单调(这是非常昂贵的)。您应该使用os:timestamp()代替;
  • 编写生成线程的本机代码,该线程将在计时器触发时发送消息。这很容易实现为NIF。

答案 1 :(得分:0)

  1. 实际上,如果你需要一个计时器,你应该使用eralng:send_after / 3或erlang:start_timer / 3,而不是计时器模块。 Timer模块使用定时器进程 实现计时器,如果应用程序有太多的计时器,它将阻止计时器进程,这将减慢您的应用程序。
  2. erlang:send_after / 3和erlang:start_timer / 3有一点不同。
    • erlang:start_timer / 3将在Time milliseconds之后将消息{timeout,TimerRef,Msg}发送到Dest。 erlang:send_after / 3只会在Time millisecond之后将Msg发送到Dest。
    • 问题是当你需要取消定时器并且已发送消息时,如果使用erlang:send_after / 3,则可能导致逻辑句柄问题。