【问题标题】:How to perform actions periodically in Erlang如何在 Erlang 中定期执行操作
【发布时间】:2015-05-10 20:42:48
【问题描述】:
-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) 中?

【问题讨论】:

标签: timer erlang periodic-task periodic-processing


【解决方案1】:

timer模块中,函数apply_interval(Time, Module, Function, Arguments)每隔时间间隔执行一次Module:Function(Arguments)。它负责生成一个进程,返回一个引用以允许稍后取消。

您也可以在同一个库中查看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) 可以帮助纠正由于进程调度造成的偏差。

【讨论】:

    【解决方案2】:

    我认为你需要这样的东西:

    start_timer() ->
        gen_server:start_link({local, clock}, ?MODULE, [], []).
    

    【讨论】:

    • 它在什么意义上回答了这个问题?
    猜你喜欢
    • 2011-08-18
    • 1970-01-01
    • 2016-02-10
    • 2016-04-19
    • 2010-11-05
    • 1970-01-01
    • 2017-06-13
    • 2020-07-10
    • 1970-01-01
    相关资源
    最近更新 更多