Lwt es una biblioteca de programación concurrente para OCaml. Proporciona un único tipo de datos: la promesa , que es un valor que se determinará en el futuro. La creación de una promesa genera un cálculo. Cuando ese cálculo es de E/S, Lwt lo ejecuta en paralelo con su código OCaml.
El código OCaml, incluida la creación y espera de promesas, se ejecuta en un solo subproceso de forma predeterminada, por lo que no tiene que preocuparse por el bloqueo o la preferencia. Puede separar el código para ejecutarlo en subprocesos separados si lo desea.
Aquí hay un programa Lwt simplista que solicita la página principal de Google y falla si la solicitud no se completa en cinco segundos:
open Lwt.Syntax
let () =
let request =
let * addresses = Lwt_unix. getaddrinfo " google.com " " 80 " [] in
let google = Lwt_unix. (( List. hd addresses).ai_addr) in
Lwt_io. (with_connection google ( fun ( incoming , outgoing ) ->
let * () = write outgoing " GET / HTTP/1.1 rn " in
let * () = write outgoing " Connection: close rnrn " in
let * response = read incoming in
Lwt. return ( Some response)))
in
let timeout =
let * () = Lwt_unix. sleep 5. in
Lwt. return None
in
match Lwt_main. run ( Lwt. pick [request; timeout]) with
| Some response -> print_string response
| None -> prerr_endline " Request timed out " ; exit 1
(* ocamlfind opt -package lwt.unix -linkpkg example.ml && ./a.out *)
En el programa, funciones como Lwt_io.write
crean promesas. La construcción let* ... in
se utiliza para esperar a que se determine una promesa; el código in
está programado para ejecutarse en una "devolución de llamada". Lwt.pick
compite con promesas entre sí y se comporta como el primero en completarlas. Lwt_main.run
obliga a ejecutar toda la red de cálculo de promesas. Todo el código OCaml visible se ejecuta en un solo subproceso, pero Lwt utiliza internamente una combinación de subprocesos de trabajo y descriptores de archivos sin bloqueo para resolver en paralelo las promesas que realizan E/S.
Lwt compila en código nativo en Linux, macOS, Windows y otros sistemas. También se compila de forma rutinaria en JavaScript para el front-end y Node mediante js_of_ocaml.
En Lwt,
Lwt
ofrece promesas...Lwt_unix
, que enlaza casi todas las llamadas al sistema Unix. Un módulo de nivel superior, Lwt_io
proporciona buenos canales de E/S.Lwt_process
es para el manejo de subprocesos.Lwt_preemptive
genera subprocesos del sistema.Lwt_react
para programación reactiva. ¡Vea la tabla de contenidos en las páginas del manual vinculadas! libev-dev
o libev-devel
.opam install conf-libev lwt
Actualmente estamos trabajando para mejorar la documentación de Lwt (drásticamente; estamos reescribiendo el manual). Mientras tanto:
Nota: gran parte del manual actual se refiere a 'a Lwt.t
como "hilos livianos" o simplemente "hilos". Esto se solucionará en el nuevo manual. 'a Lwt.t
es una promesa y no tiene nada que ver con el sistema o los subprocesos preventivos.
Abra una incidencia, visite el chat de Discord, pregunte en discut.ocaml.org o en Stack Overflow.
Los anuncios de lanzamiento se realizan en discut.ocaml.org. Ver el repositorio para "Solo versiones" también es una opción.
CONTRIBUTING.md
contiene consejos para trabajar en el código, como cómo verificar el código, cómo funciona la revisión, etc. También hay un resumen de alto nivel de la base del código.