今天来看一下erlang中的时钟如何实现的:
-module(timeout).
-export([sleep/1,flush_buffer/0]).
%%%睡眠函数
sleep(Time) ->
receive
after Time ->
true
end.
%%%清空邮箱
flush_buffer() ->
receive
AnyMessage ->
flush_buffer()
after 0 ->
true
end.
%%% 消息优先级的实现
%% 函数priority_receive会返回邮箱中第一个消息,除非有消息interrupt发送到了邮箱中,此时将返
%%回interrupt。通过首先使用超时时长0来调用receive去匹配interrupt,我们可以检查邮箱中是否已经有了
%%%这个消息。如果是,我们就返回它,否则,我们再通过模式AnyMessage去调用receive,这将选中邮箱中的
%%第一条消息。
priority_receive() ->
receive
interrupt ->
interrupt
after 0 ->
receive
AnyMessage ->
AnyMessage
end
end.
上面主要是睡眠 和清空“邮箱” ,还有就是优先级的简单实现.
下面再来一段吧:
-module(timer).
-export([timeout/2,cancel/1,timer/3]).
timeout(Time,Alarm) ->
spawn(timer,timer,[self(),Time,Alarm]).
cancel(Timer) ->
Timer ! {self(),cancel}.
timer(Pid,Time,Alarm) ->
receive
{Pid,cancel} ->
true
after Time ->
Pid ! Alarm
end.
shell中演示一下:
13> Pid=self(),
13> timer:timer(Pid,1000,hellword).
hellword
14>