Module Lwt_preemptive
This module allows to mix preemptive threads with Lwt
cooperative threads. It maintains an extensible pool of preemptive threads to which you can detach computations.
See Mwt for a more modern implementation.
val detach : ('a -> 'b) -> 'a -> 'b Lwt.t
detach f x
runs the computationf x
in a separate preemptive thread.detach
evaluates to an Lwt promise, which is pending until the preemptive thread completes.detach
callssimple_init
internally, which means that the number of preemptive threads is capped by default at four. If you would like a higher limit, callinit
orset_bounds
directly.Note that Lwt thread-local storage (i.e.,
Lwt.with_value
) cannot be safely used from withinf
. The same goes for most of the rest of Lwt. If you need to run an Lwt thread inf
, userun_in_main
.
val run_in_main : (unit -> 'a Lwt.t) -> 'a
run_in_main f
can be called from a detached computation to executef ()
in the main preemptive thread, i.e. the one executingLwt_main.run
.run_in_main f
blocks untilf ()
completes, then returns its result. Iff ()
raises an exception,run_in_main f
raises the same exception.Lwt.with_value
may be used insidef ()
.Lwt.get
can correctly retrieve values set this way insidef ()
, but not values set usingLwt.with_value
outsidef ()
.
val init : int -> int -> (string -> unit) -> unit
init min max log
initialises this module. i.e. it launches the minimum number of preemptive threads and starts the dispatcher.- parameter min
is the minimum number of threads
- parameter max
is the maximum number of threads
- parameter log
is used to log error messages
If
Lwt_preemptive
has already been initialised, this call only modify bounds and the log function.
val simple_init : unit -> unit
simple_init ()
checks if the library is not yet initialized, and if not, does a simple initialization. The minimum number of threads is set to zero, maximum to four, and the log function is left unchanged, i.e. the default built-in logging function is used. SeeLwt_preemptive.init
.Note: this function is automatically called by
detach
.
val get_bounds : unit -> int * int
get_bounds ()
returns the minimum and the maximum number of preemptive threads.
val set_bounds : (int * int) -> unit
set_bounds (min, max)
set the minimum and the maximum number of preemptive threads.
val set_max_number_of_threads_queued : int -> unit
Sets the size of the waiting queue, if no more preemptive threads are available. When the queue is full,
detach
will sleep until a thread is available.