Erlang中的高分辨率计时器

3
有没有人知道在Erlang中是否可以制作高分辨率计时器?根据文档,所有计时器和超时都是以毫秒为单位测量的。需要进行微秒级别的延迟。例如,可以使用以下语法而不是 timer:apply_after(MilliSec, Module, Function, Arguments).,如下:timer:apply_after(MicroSec, Module, Function, Arguments).
2个回答

3

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

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

  • 使用Erlang原语等待截断的毫秒数,然后通过繁忙循环进行调整。请注意erlang:now()不是真实时间函数,因为它保证是单调的(这相当昂贵)。您应该使用os:timestamp()代替;
  • 编写本机代码,生成一个线程,当定时器触发时会发送一条消息。这可以很容易地作为NIF实现。

-1
实际上,如果您需要一个计时器,应该使用 erlang:send_after/3 或 erlang:start_timer/3,而不是 timer 模块。Timer 模块使用计时器进程来实现计时器,如果应用程序有太多计时器,它将阻塞计时器进程,从而减慢应用程序的速度。
erlang:send_after/3 和 erlang:start_timer/3 有一个区别。 - erlang:start_timer/3 将在 Time 毫秒后向 Dest 发送消息 {timeout,TimerRef,Msg}。erlang:send_after/3 只会在 Time 毫秒后发送 Msg 到 Dest。 - 问题在于当您需要取消计时器并且已经发送了 Msg 时,如果使用 erlang:send_after/3,可能会导致逻辑处理问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接