有人知道是否可以在 Erlang 中制作高分辨率计时器吗?
根据文档,所有计时器和超时都以毫秒为单位。
需要以微秒为单位进行延迟。例如,而不是
timer:apply_after(MilliSec, Module, Function, Arguments).
像
timer:apply_after(MicroSec, Module, Function, Arguments).
问问题
2016 次
2 回答
3
实际上,所有计时器和超时原语都以毫秒为单位,包括:
receive
...after
原始(这是timer
模块最终依赖的);erlang:send_after/3
并且erlang:start_timer/3
依赖于相同的机制;driver_set_timer
链接驱动程序的功能。
可以考虑两种方法来实现亚毫秒计时器:
- 使用 Erlang 原语等待截断的毫秒数,然后使用繁忙的循环进行调整。请注意,这
erlang:now()
不是实时功能,因为它保证是单调的(而且这非常昂贵)。你应该os:timestamp()
改用; - 编写本机代码,生成一个线程,该线程将在计时器触发时发送消息。这可以很容易地实现为 NIF。
于 2013-09-27T14:39:47.363 回答
-1
- 在实践中,如果你需要一个定时器,你应该使用 eralng:send_after/3 或 erlang:start_timer/3,而不是定时器模块。Timer 模块使用定时器进程来实现定时器,如果应用程序有太多的定时器,它会阻塞定时器进程,这会减慢你的应用程序。
- 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 回答