timer(3)

NAME
timer - Timer functions.

DESCRIPTION

This module provides useful functions related to time. Unless otherwise stated, time is always measured in milliseconds. All timer functions return immediately, regardless of work done by another process.

Successful evaluations of the timer functions give return values containing a timer reference, denoted TRef. By using cancel/1, the returned reference can be used to cancel any requested action. A TRef is an Erlang term, which contents must not be changed.

The time-outs are not exact, but are at least as long as requested.

Creating timers using erlang:send_after/3 and erlang:start_timer/3 is more efficient than using the timers provided by this module. However, the timer module has been improved in OTP 25, making it more efficient and less susceptible to being overloaded. See the Timer Module section in the Efficiency Guide.

DATA TYPES
time() = integer() >= 0

    Time in milliseconds.
tref()

    A timer reference.

EXPORTS

apply_after(Time, Module, Function, Arguments) ->
               {ok, TRef} | {error, Reason}

    Types:
        Time = time()
        Module = module()
        Function = atom()
        Arguments = [term()]
        TRef = tref()
        Reason = term()

    Evaluates spawn(Module, Function, Arguments) after Time milliseconds.

    Returns {ok, TRef} or {error, Reason}.

apply_interval(Time, Module, Function, Arguments) ->
                  {ok, TRef} | {error, Reason}

    Types:
        Time = time()
        Module = module()
        Function = atom()
        Arguments = [term()]
        TRef = tref()
        Reason = term()

    Evaluates spawn(Module, Function, Arguments) repeatedly at intervals of Time, irrespective of whether a previously spawned process has finished or not.

        Warning:
    If the execution time of the spawned process is, on average, greater than the given Time, multiple such processes will run at the same time. With long execution times, short intervals, and many interval timers running, this may even lead to exceeding the number of allowed processes. As an extreme example, consider [timer:apply_interval(1, timer, sleep, [1000]) || _ <- lists:seq(1, 1000)], that is, 1,000 interval timers executing a process that takes 1s to complete, started in intervals of 1ms, which would result in 1,000,000 processes running at the same time, far more than a node started with default settings allows (see the System Limits section in the Effiency Guide).

    Returns {ok, TRef} or {error, Reason}.

apply_repeatedly(Time, Module, Function, Arguments) ->
                    {ok, TRef} | {error, Reason}

    Types:
        Time = time()
        Module = module()
        Function = atom()
        Arguments = [term()]
        TRef = tref()
        Reason = term()

    Evaluates spawn(Module, Function, Arguments) repeatedly at intervals of Time, waiting for the spawned process to finish before starting the next.

    If the execution time of the spawned process is greater than the given Time, the next process is spawned immediately after the one currently running has finished. Assuming that execution times of the spawned processes performing the applies on average are smaller than Time, the amount of applies made over a large amount of time will be the same even if some individual execution times are larger than Time. The system will try to catch up as soon as possible. For example, if one apply takes 2.5*Time, the following two applies will be made immediately one after the other in sequence.

    Returns {ok, TRef} or {error, Reason}.

cancel(TRef) -> {ok, cancel} | {error, Reason}

    Types:
        TRef = tref()
        Reason = term()

    Cancels a previously requested time-out. TRef is a unique timer reference returned by the related timer function.

    Returns {ok, cancel}, or {error, Reason} when TRef is not a timer reference.

exit_after(Time, Reason1) -> {ok, TRef} | {error, Reason2}
exit_after(Time, Target, Reason1) -> {ok, TRef} | {error, Reason2}

    Types:
        Time = time()
        Target = pid() | (RegName :: atom())
        TRef = tref()
        Reason1 = Reason2 = term()

    exit_after/2 is the same as exit_after(Time, self(), Reason1).

    exit_after/3 sends an exit signal with reason Reason1 to Target, which can be a local process identifier or an atom of a registered name. Returns {ok, TRef} or {error, Reason2}.

hms(Hours, Minutes, Seconds) -> MilliSeconds

    Types:
        Hours = Minutes = Seconds = MilliSeconds = integer() >= 0

    Returns the number of milliseconds in Hours + Minutes + Seconds.

hours(Hours) -> MilliSeconds

    Types:
        Hours = MilliSeconds = integer() >= 0

    Returns the number of milliseconds in Hours.

kill_after(Time) -> {ok, TRef} | {error, Reason2}
kill_after(Time, Target) -> {ok, TRef} | {error, Reason2}

    Types:
        Time = time()
        Target = pid() | (RegName :: atom())
        TRef = tref()
        Reason2 = term()

    kill_after/1 is the same as exit_after(Time, self(), kill).

    kill_after/2 is the same as exit_after(Time, Target, kill).

minutes(Minutes) -> MilliSeconds

    Types:
        Minutes = MilliSeconds = integer() >= 0

    Returns the number of milliseconds in Minutes.

now_diff(T2, T1) -> Tdiff

    Types:
        T1 = T2 = erlang:timestamp()
        Tdiff = integer()
            In microseconds

    Calculates the time difference Tdiff = T2 - T1 in microseconds, where T1 and T2 are time-stamp tuples on the same format as returned from erlang:timestamp/0 or os:timestamp/0.

seconds(Seconds) -> MilliSeconds

    Types:
        Seconds = MilliSeconds = integer() >= 0

    Returns the number of milliseconds in Seconds.

send_after(Time, Message) -> {ok, TRef} | {error, Reason}
send_after(Time, Destination, Message) ->
              {ok, TRef} | {error, Reason}

    Types:
        Time = time()
        Destination =
            pid() |
            (RegName :: atom()) |
            {RegName :: atom(), Node :: node()}
        Message = term()
        TRef = tref()
        Reason = term()

        send_after/3:
            Evaluates Destination ! Message after Time milliseconds. (Destination can be a remote or local process identifier, an atom of a registered name or a tuple {RegName, Node} for a registered name at another node.)

            Returns {ok, TRef} or {error, Reason}.

            See also the Timer Module section in the Efficiency Guide.

        send_after/2:
            Same as send_after(Time, self(), Message).

send_interval(Time, Message) -> {ok, TRef} | {error, Reason}
send_interval(Time, Destination, Message) ->
                 {ok, TRef} | {error, Reason}

    Types:
        Time = time()
        Destination =
            pid() |
            (RegName :: atom()) |
            {RegName :: atom(), Node :: node()}
        Message = term()
        TRef = tref()
        Reason = term()

        send_interval/3:
            Evaluates Destination ! Message repeatedly after Time milliseconds. (Destination can be a remote or local process identifier, an atom of a registered name or a tuple {RegName, Node} for a registered name at another node.)

            Returns {ok, TRef} or {error, Reason}.

        send_interval/2:
            Same as send_interval(Time, self(), Message).

sleep(Time) -> ok

    Types:
        Time = timeout()

    Suspends the process calling this function for Time milliseconds and then returns ok, or suspends the process forever if Time is the atom infinity. Naturally, this function does not return immediately.

        Note:
    Before OTP 25, timer:sleep/1 did not accept integer timeout values greater than 16#ffffffff, that is, 2^32-1. Since OTP 25, arbitrarily high integer values are accepted.

start() -> ok

    Starts the timer server. Normally, the server does not need to be started explicitly. It is started dynamically if it is needed. This is useful during development, but in a target system the server is to be started explicitly. Use configuration parameters for Kernel for this.

tc(Fun) -> {Time, Value}
tc(Fun, Arguments) -> {Time, Value}
tc(Module, Function, Arguments) -> {Time, Value}

    Types:
        Module = module()
        Function = atom()
        Arguments = [term()]
        Time = integer()
        Value = term()

        tc/3:
            Calls function timer:tc(Module, Function, Arguments, microsecond).

        tc/2:
            Calls function timer:tc(Fun, Arguments, microsecond).

        tc/1:
            Calls function timer:tc(Fun, microsecond).

tc(Fun, TimeUnit) -> {Time, Value}
tc(Fun, Arguments, TimeUnit) -> {Time, Value}
tc(Module, Function, Arguments, TimeUnit) -> {Time, Value}

    Types:
        Module = module()
        Function = atom()
        Arguments = [term()]
        TimeUnit = erlang:time_unit()
        Time = integer()
            In the specified TimeUnit
        Value = term()

        tc/4:
            Evaluates apply(Module, Function, Arguments) and measures the elapsed real time as reported by erlang:monotonic_time/0.

            Returns {Time, Value}, where Time is the elapsed real time in the specified TimeUnit, and Value is what is returned from the apply.

        tc/3:
            Evaluates apply(Fun, Arguments). Otherwise the same as tc/4.

        tc/2:
            Evaluates Fun(). Otherwise the same as tc/3.

EXAMPLES

Example 1

The following example shows how to print "Hello World!" in 5 seconds:

1> timer:apply_after(5000, io, format, ["~nHello World!~n", []]).
{ok,TRef}
Hello World!

Example 2

The following example shows a process performing a certain action, and if this action is not completed within a certain limit, the process is killed:

Pid = spawn(mod, fun, [foo, bar]),
%% If pid is not finished in 10 seconds, kill him
{ok, R} = timer:kill_after(timer:seconds(10), Pid),
%% We change our mind...
timer:cancel(R),

NOTES

A timer can always be removed by calling cancel/1.

An interval timer, that is, a timer created by evaluating any of the functions apply_interval/4, send_interval/3, and send_interval/2 is linked to the process to which the timer performs its task.

A one-shot timer, that is, a timer created by evaluating any of the functions apply_after/4, send_after/3, send_after/2, exit_after/3, exit_after/2, kill_after/2, and kill_after/1 is not linked to any process. Hence, such a timer is removed only when it reaches its time-out, or if it is explicitly removed by a call to cancel/1.