Module Lwt_pool
External resource pools.
This module provides an abstraction for managing collections of resources. One example use case is for managing a pool of database connections, where instead of establishing a new connection each time you need one (which is expensive), you can keep a pool of opened connections and reuse ones that are free.
It also provides the capability of:
- specifying the maximum number of resources that the pool can manage simultaneously,
- checking whether a resource is still valid before/after use, and
- performing cleanup logic before dropping a resource.
The following example illustrates how it is used with an imaginary Db
module:
let uri = "postgresql://localhost:5432"
(* Create a database connection pool with max size of 10. *)
let pool =
Lwt_pool.create 10
~dispose:(fun connection -> Db.close connection |> Lwt.return)
(fun () -> Db.connect uri |> Lwt.return)
(* Use the pool in queries. *)
let create_user name =
Lwt_pool.use pool (fun connection ->
connection
|> Db.insert "users" [("name", name)]
|> Lwt.return
)
Note that this is not intended to keep a pool of system threads. If you want to have such pool, consider using Lwt_preemptive
.
val create : int -> ?validate:('a -> bool Lwt.t) -> ?check:('a -> (bool -> unit) -> unit) -> ?dispose:('a -> unit Lwt.t) -> (unit -> 'a Lwt.t) -> 'a t
create n ?check ?validate ?dispose f
creates a new pool with at mostn
elements.f
is used to create a new pool element. Elements are created on demand and re-used until disposed of.- parameter validate
is called each time a pool element is accessed by
use
, before the element is provided touse
's callback. Ifvalidate element
resolves totrue
the element is considered valid and is passed to the callback for use as-is. Ifvalidate element
resolves tofalse
the tested pool element is passed todispose
then dropped, with a new one is created to takeelement
's place in the pool.validate
is available since Lwt 3.2.0.
- parameter check
is called after the resolution of
use
's callback when the resolution is a failed promise.check element is_ok
must callis_ok
exactly once withtrue
ifelement
is still valid andfalse
otherwise. Ifcheck
callsis_ok false
thendispose
will be run onelement
and the element will not be returned to the pool.
val use : 'a t -> ('a -> 'b Lwt.t) -> 'b Lwt.t
use p f
requests one free element of the poolp
and gives it to the functionf
. The element is put back into the pool after the promise created byf
completes.In the case that
p
is exhausted and the maximum number of elements is reached,use
will wait until one becomes free.
val clear : 'a t -> unit Lwt.t
clear p
will clear all elements inp
, calling thedispose
function associated withp
on each of the cleared elements. Any elements fromp
which are currently in use will be disposed of once they are released.The next call to
use p
afterclear p
guarantees a freshly created pool element.Disposals are performed sequentially in an undefined order.
- since
- 3.2.0