如何在 Erlang 中定期执行操作
How to perform actions periodically in Erlang
-define(INTERVAL, 1000).
init([]) ->
Timer = erlang:send_after(?INTERVAL, self(), tick),
{ok, Timer}.
handle_info(tick, OldTimer) ->
erlang:cancel_timer(OldTimer),
io:format("Tick ~w~n", [OldTimer]),
Timer = erlang:send_after(?INTERVAL, self(), tick).
{noreplay, Timer}.
start_clock() ->
{_, Timer} = init([]),
spawn(clock, handle_info, [tick, Timer]).
我的代码如上,但输出不是我想要的。
如何将 init() 和 handle_info() 集成到主函数 (start_clock) 中?
我想你需要这样的东西:
start_timer() ->
gen_server:start_link({local, clock}, ?MODULE, [], []).
在timer模块中,函数apply_interval(Time, Module, Function, Arguments)
每隔Time间隔执行Module:Function(Arguments)。它负责生成一个进程,returns 一个允许稍后取消的引用。
您也可以在同一个库中查看 send_interval(Time, Pid, Message)
。
您还可以实现一个简单的循环,例如:
loop(Args,Tick) when is_integer(Tick), Tick >= 0 ->
receive
stop -> stopped
after Tick
do_something(Args),
{NewArgs,NewTick} = new_args(Args,Tick),
loop(NewArgs,NewTick)
end.
它不是一个实时定时器,但是函数new_args(Args,Tick)可以帮助纠正由于进程调度造成的偏差。
-define(INTERVAL, 1000).
init([]) ->
Timer = erlang:send_after(?INTERVAL, self(), tick),
{ok, Timer}.
handle_info(tick, OldTimer) ->
erlang:cancel_timer(OldTimer),
io:format("Tick ~w~n", [OldTimer]),
Timer = erlang:send_after(?INTERVAL, self(), tick).
{noreplay, Timer}.
start_clock() ->
{_, Timer} = init([]),
spawn(clock, handle_info, [tick, Timer]).
我的代码如上,但输出不是我想要的。 如何将 init() 和 handle_info() 集成到主函数 (start_clock) 中?
我想你需要这样的东西:
start_timer() ->
gen_server:start_link({local, clock}, ?MODULE, [], []).
在timer模块中,函数apply_interval(Time, Module, Function, Arguments)
每隔Time间隔执行Module:Function(Arguments)。它负责生成一个进程,returns 一个允许稍后取消的引用。
您也可以在同一个库中查看 send_interval(Time, Pid, Message)
。
您还可以实现一个简单的循环,例如:
loop(Args,Tick) when is_integer(Tick), Tick >= 0 ->
receive
stop -> stopped
after Tick
do_something(Args),
{NewArgs,NewTick} = new_args(Args,Tick),
loop(NewArgs,NewTick)
end.
它不是一个实时定时器,但是函数new_args(Args,Tick)可以帮助纠正由于进程调度造成的偏差。