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()
- 如果是Dest::atom(), 即便这个Dest 没有绑定一个process 也不会报错, 而是返回正常的TimeRef。但是在进程不存在和进程退出的情况下,该timer 不是立即取消,而是在Time 时间结束的时候才取消的。
- 如果是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中三种定时器的实现方式:receive…after、erlang:send_after和erlang:start_timer。receive…after是语法层面的实现,适用于频繁的定时任务;erlang:send_after和start_timer作为BIFs,两者在超时消息格式上有所区别,send_after直接发送Msg,start_timer则发送{timeout, TimerRef, Msg},便于识别和取消。此外,还提及了timer模块的使用,尽管提供了管理定时器的进程,但在高负载下可能效率不高,因此不建议在需要频繁操作定时器的场景中使用。"
119187827,7385329,十六进制字符串转十进制数,"['字符串操作', '进制转换']

1906

被折叠的 条评论
为什么被折叠?



