run_at time f a
runs f a
as soon as possible after time
. If time
is in the
past, then run_at
will immediately schedule a job t that will run f a
. In no
situation will run_at
actually call f
itself. The call to f
will always be in
another job.
run_after
is like run_at
, except that one specifies a time span rather than an
absolute time.
at time
returns a deferred d
that will become determined as soon as possible
after time
after
is like at
, except that one specifies a time span rather than an absolute
time.
If you set up a lot of after
events at the beginning of your program they will
trigger at the same time. Use Time.Span.randomize
to even that out.
with_timeout span d
does pretty much what one would expect. Note that at the
point of checking if d
is determined and the timeout has expired, the resulting
deferred will be determined with `Result
. In other words, since there is an
inherent race between d
and the timeout, preference is given to d
.
run_at
and run_after
with the ability to abort or
reschedule an event that hasn't yet happened.
at_varying_intervals f ?stop
returns a stream whose next element becomes
determined by calling f ()
and waiting for that amount of time, and then looping
to determine subsequent elements. The stream will end after stop
becomes
determined.
at_intervals interval ?start ?stop
returns a stream whose elements will become
determined at nonnegative integer multiples of interval
after the start
time,
until stop
becomes determined:
start + 0 * interval start + 1 * interval start + 2 * interval start + 3 * interval ...
If the interval is too small or the CPU is too loaded, at_intervals
will skip
until the next upcoming multiple of interval
after start.
every' ?start ?stop span f
runs f ()
every span
amount of time starting when
start
becomes determined and stopping when stop
becomes determined. every
waits until the result of f ()
becomes determined before waiting for the next
span
.
It is guaranteed that if stop
becomes determined, even during evaluation of f
,
then f
will not be called again by a subsequent iteration of the loop.
It is an error for span
to be nonpositive.
With ~continue_on_error:true
, when f
asynchronously raises, iteration continues.
With ~continue_on_error:false
, if f
asynchronously raises, then iteration only
continues when the result of f
becomes determined.
Exceptions raised by f
are always sent to monitor in effect when every'
was
called, even with ~continue_on_error:true
.
every ?start ?stop span f
is
every' ?start ?stop span (fun () -> f (); Deferred.unit)
run_at_intervals' ?start ?stop span f
runs f()
at increments of start + i *
span
for non-negative integers i
, until stop
becomes determined.
run_at_intervals'
waits for the result of f
to become determined before waiting
for the next interval.
Exceptions raised by f
are always sent to monitor in effect when
run_at_intervals'
was called, even with ~continue_on_error:true
.
run_at_intervals ?start ?stop ?continue_on_error span f
is equivalent to:
run_at_intervals' ?start ?stop ?continue_on_error span
(fun () -> f (); Deferred.unit)