Erlang几种定时器的实现

receive…after

语法层面的实现。一旦timeout立即把进程加到调度队列,使用频度比较高。

erlang:send_after与erlang:start_timer

bif的实现。

erlang:start_timer(Time, Dest, Msg) -> TimeRef

Time: 最大的值为2^32 -1 milliseconds, 大约为49.7天。
Dest: 本地节点,类型为atom()或者pid()

  1. 如果是Dest::atom(), 即便这个Dest 没有绑定一个process 也不会报错, 而是返回正常的TimeRef。但是在进程不存在和进程退出的情况下,该timer 不是立即取消,而是在Time 时间结束的时候才取消的。
  2. 如果是Name::pid(), 如果进程存在或者进程退出,该timer 会立即取消
 erlang:send_after(Time, Dest, Msg) -> TimerRef

参数和返回类型和start_timer相同。

区别

虽然两个函数都返回 TimerRef。用户可以用这个TimerRef来取消定时器.。唯一的差别是在超时的时候发送的消息不同: send_after是Msg,start_timer是{timeout, TimerRef, Msg}。
如果超时,消息已经被放到目标进程的消息队列中,没有TimerRef的话无法确定Msg是来自哪个定时器,就无法取消。

timer模块

timer模块使用一个分离的进程来管理定时器,而且如果很多进程频繁地创建和取消这些计时器(特别是当使用SMP模拟器时),那个管理进程很容易负载过重。(不建议使用)

你可能感兴趣的:(Erlang)