run p calls the Lwt scheduler repeatedly until p resolves, and returns the value of p if it is fulfilled. If p is rejected with an exception, that exception is raised.
Every native or bytecode program that uses Lwt should always use this function for evaluating a promise at the top level (such as its main function or main loop), otherwise promises that depend on I/O operations will not be resolved.
Example:
let main () = Lwt_io.write_line Lwt_io.stdout "hello world"
let () = Lwt_main.run @@ main ()
When targeting JavaScript, Lwt_main.run is not available, but neither it's necessary since the JS environment automatically takes care of the I/O considerations.
On Unix, calling Lwt_main.run installs a SIGCHLD handler, which is needed for the implementations of Lwt_unix.waitpid and Lwt_unix.wait4. As a result, programs that call Lwt_main.run and also use non-Lwt system calls need to handle those system calls failing with EINTR.
Note that you should avoid using run inside threads
- The calling threads will not resume before
run returns. - Successive invocations of
run are serialized: an invocation of run will not terminate before all subsequent invocations are terminated.
Note also that it is not safe to call run in a function registered with Pervasives.at_exit, use the at_exit function of this module instead.