3


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

timer:apply_after(MicroSec, Module, Function, Arguments).

4

2 回答 2

3

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

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

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