Lwt ist eine gleichzeitige Programmierbibliothek für OCaml. Es stellt einen einzigen Datentyp bereit: das Versprechen , bei dem es sich um einen Wert handelt, der in der Zukunft bestimmt wird. Das Erstellen eines Versprechens führt zu einer Berechnung. Wenn es sich bei dieser Berechnung um E/A handelt, führt Lwt sie parallel zu Ihrem OCaml-Code aus.
OCaml-Code, einschließlich der Erstellung und des Wartens auf Versprechen, wird standardmäßig in einem einzelnen Thread ausgeführt, sodass Sie sich keine Gedanken über Sperren oder Vorbelegung machen müssen. Sie können auf Opt-In-Basis Code abtrennen, um ihn in separaten Threads auszuführen.
Hier ist ein vereinfachtes Lwt-Programm, das die Google-Startseite anfordert und fehlschlägt, wenn die Anfrage nicht innerhalb von fünf Sekunden abgeschlossen wird:
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 *)
Im Programm erstellen Funktionen wie Lwt_io.write
Versprechen. Das Konstrukt let* ... in
wird verwendet, um darauf zu warten, dass ein Versprechen bestimmt wird; Der Code nach in
soll in einem „Rückruf“ ausgeführt werden. Lwt.pick
lässt Versprechen gegeneinander antreten und verhält sich als erster, der sie erfüllt. Lwt_main.run
erzwingt die Ausführung des gesamten Promise-Computation-Netzwerks. Der gesamte sichtbare OCaml-Code wird in einem einzigen Thread ausgeführt, aber Lwt verwendet intern eine Kombination aus Arbeitsthreads und nicht blockierenden Dateideskriptoren, um die Versprechen, die E/A durchführen, parallel aufzulösen.
Lwt kompiliert zu nativem Code auf Linux, macOS, Windows und anderen Systemen. Es wird außerdem routinemäßig von js_of_ocaml in JavaScript für das Frontend und den Knoten kompiliert.
Im Lwt,
Lwt
verspricht...Lwt_unix
, die fast jeden Unix-Systemaufruf bindet. Ein übergeordnetes Modul Lwt_io
stellt schöne I/O-Kanäle bereit.Lwt_process
dient der Unterprozessverarbeitung.Lwt_preemptive
erzeugt Systemthreads.Lwt_react
für reaktive Programmierung. Siehe Inhaltsverzeichnis auf den verlinkten Handbuchseiten! libev-dev
oder libev-devel
genannt.opam install conf-libev lwt
Wir arbeiten derzeit an der Verbesserung der Lwt-Dokumentation (drastisch; wir schreiben das Handbuch neu). Inzwischen:
Hinweis: Ein Großteil des aktuellen Handbuchs bezeichnet 'a Lwt.t
als „leichte Fäden“ oder einfach nur „Fäden“. Dies wird im neuen Handbuch behoben. 'a Lwt.t
ist ein Versprechen und hat nichts mit System- oder präventiven Threads zu tun.
Öffnen Sie ein Problem, besuchen Sie den Discord-Chat, fragen Sie auf diskutiere.ocaml.org oder auf Stack Overflow.
Veröffentlichungsankündigungen erfolgen auf diskussion.ocaml.org. Es ist auch eine Option, sich das Repo für „Releases only“ anzusehen.
CONTRIBUTING.md
enthält Tipps für die Arbeit am Code, z. B. zum Auschecken des Codes, zur Funktionsweise der Überprüfung usw. Außerdem gibt es einen allgemeinen Überblick über die Codebasis.