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)