val never_ending : unit -> 'a Lwt.t
val worker : string -> on_event:(string -> [ `Ended | `Failed of string | `Started ] -> unit Lwt.t) -> run:(unit -> unit Lwt.t) -> cancel:(unit -> unit Lwt.t) -> unit Lwt.t
worker name ~on_event ~run ~cancel internally calls
run () (which returns a promise
p) and returns its own promise
p becomes fulfilled, then
work also becomes fulfilled. If
p becomes rejected then
cancel () is called and, once its promise is resolved,
work is fulfilled. This gives the opportunity for the function
cancel to clean-up some resources.
on_event is called at different times (start, failure, end) and is mostly meant as a logging mechanism but can also be used for other purposes such as synchronization between different workers.
If the promises returned by
cancel raise an exception or become rejected, the exception/failure is simply ignored and the promise is treated as having resolved anyway.
Note that the promise
work returned by the
worker function is not cancelable. If you need to cancel the promise returned by
run, you need to embed your own synchronization system within
let p, r = Lwt.wait in
let run () =
let main = … in
Lwt.pick [main ; p]