【问题标题】:High resolution timer in erlangerlang中的高分辨率计时器
【发布时间】:2013-09-29 09:40:15
【问题描述】:


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

【问题讨论】:

    标签: timer erlang


    【解决方案1】:

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

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

    • 使用 Erlang 原语等待截断的毫秒数,然后使用繁忙循环进行调整。请注意,erlang:now() 不是实时函数,因为它保证是单调的(而且这非常昂贵)。你应该改用os:timestamp()
    • 编写本机代码,生成一个线程,该线程将在定时器触发时发送消息。这可以很容易地实现为 NIF。

    【讨论】:

      【解决方案2】:
      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,可能会导致逻辑句柄问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-02
        • 2011-10-31
        • 1970-01-01
        相关资源
        最近更新 更多