Lwt est une bibliothèque de programmation concurrente pour OCaml. Il fournit un seul type de données : la promesse , qui est une valeur qui sera déterminée dans le futur. Créer une promesse engendre un calcul. Lorsque ce calcul est une E/S, Lwt l'exécute en parallèle avec votre code OCaml.
Le code OCaml, y compris la création et l'attente des promesses, est exécuté par défaut dans un seul thread, vous n'avez donc pas à vous soucier du verrouillage ou de la préemption. Vous pouvez détacher le code pour qu'il soit exécuté dans des threads distincts sur une base volontaire.
Voici un programme Lwt simpliste qui demande la page d'accueil de Google et échoue si la demande n'est pas complétée dans les cinq secondes :
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 *)
Dans le programme, des fonctions telles que Lwt_io.write
créent des promesses. La construction let* ... in
est utilisée pour attendre qu'une promesse soit déterminée ; le code après in
est programmé pour s'exécuter dans un "rappel". Lwt.pick
fait des courses les uns contre les autres et se comporte comme le premier à terminer. Lwt_main.run
force l'exécution de l'ensemble du réseau de calcul de promesses. Tout le code OCaml visible est exécuté dans un seul thread, mais Lwt utilise en interne une combinaison de threads de travail et de descripteurs de fichiers non bloquants pour résoudre en parallèle les promesses qui effectuent des E/S.
Lwt compile en code natif sur Linux, macOS, Windows et d'autres systèmes. Il est également régulièrement compilé en JavaScript pour le front-end et Node par js_of_ocaml.
En Lwt,
Lwt
offre des promesses...Lwt_unix
, qui lie presque tous les appels système Unix. Un module de niveau supérieur, Lwt_io
fournit de jolis canaux d'E/S.Lwt_process
est destiné à la gestion des sous-processus.Lwt_preemptive
génère des threads système.Lwt_react
pour la programmation réactive. Consultez la table des matières sur les pages de manuel liées ! libev-dev
ou libev-devel
.opam install conf-libev lwt
Nous travaillons actuellement à l'amélioration de la documentation Lwt (de manière drastique ; nous réécrivons le manuel). En attendant:
Remarque : une grande partie du manuel actuel fait référence à 'a Lwt.t
comme à des "threads légers" ou simplement à des "threads". Ce problème sera corrigé dans le nouveau manuel. 'a Lwt.t
est une promesse et n'a rien à voir avec le système ou les threads préemptifs.
Ouvrez un problème, visitez le chat Discord, posez des questions sur discut.ocaml.org ou sur Stack Overflow.
Les annonces de sortie sont faites sur discut.ocaml.org. Regarder le dépôt pour les « versions uniquement » est également une option.
CONTRIBUTING.md
contient des conseils pour travailler sur le code, comme comment vérifier le code, comment fonctionne la révision, etc. Il existe également un aperçu de haut niveau de la base de code.