是否可以在Erlang中进行持续性操作?

时间:2017-05-17 07:18:04

标签: function timer erlang

我想在特定的时间间隔内执行一个函数,我的意思是:

action()->
...
...
move(2) for 3 sec. %hypothetical example  where it's executed each sec.

我以为我可以这样做:

action() -> 
... 
... 
move(2),
sleep(1),
move(2),
sleep(1),
move(2).

但是,我想知道是否有其他方法可以实现它,因为我查看了计时器模块,但我找不到任何可以使用的方法。

谢谢!

2 个答案:

答案 0 :(得分:1)

递归是您正在寻找的

快速回答您的问题:

action(0)->
    done;
action(Count)->
    io:format("moved"),
    sleep(1000),
    action(Count - 1).

做一些有用的事情:

   action()->
        Pid = spawn(fun()->start_moving(3) end),
        sleep(10),
        exit(Pid, terminate).
    start_moving(0)->
        done;
    start_moving(Count)->
        io:format("moved a little"),
        sleep(1000),
        start_moving(Count -1).

你需要根据你的应用程序进行改进,这里有一个你可以很好地控制你的间隔任务的例子:

action()->
    Ref = make_ref(),
    Count = 3,
    Interval = 1000,
    Pid = spawn(fun()->start_moving(Ref, Count, Interval) end),
    %do lots of stuff
    sleep(10000)
    % stop moving
    Pid ! {Ref, stop}.

start_moving(Ref, Interval, 0)->
    done;
start_moving(Ref, Interval, Count)->
    receive
        {Ref, stop}->
             ok;
        _->
             start_moving(Ref, Interval, Count)
    after
        Interval->
            io:format("moving"),
            start_moving(Ref, Interval, Count - 1)
    end.

答案 1 :(得分:1)

如果不是睡觉,你只想继续调用函数直到时间过去,你可以使用这样的东西:

execute_while(Fun, N)->
  execute_while(Fun, N, timer:tc(Fun)).

execute_while(Fun, N, {Time, _Value}) when N>=Time ->
  {Time2, Value2} = timer:tc(Fun),
  execute_while(Fun, N, {Time + Time2, Value2});
execute_while(_, _, R) ->
R. 

这样称呼:

execute_while(fun()-> move() end, 1000).