Lwt adalah perpustakaan pemrograman bersamaan untuk OCaml. Ini menyediakan satu tipe data: janji , yang merupakan nilai yang akan ditentukan di masa depan. Membuat janji akan memunculkan komputasi. Ketika komputasi tersebut adalah I/O, Lwt menjalankannya secara paralel dengan kode OCaml Anda.
Kode OCaml, termasuk membuat dan menunggu janji, dijalankan dalam satu thread secara default, jadi Anda tidak perlu khawatir tentang penguncian atau preemption. Anda dapat melepaskan kode untuk dijalankan di thread terpisah berdasarkan keikutsertaan.
Berikut adalah program Lwt sederhana yang meminta halaman depan Google, dan gagal jika permintaan tidak diselesaikan dalam lima detik:
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 *)
Dalam program ini, fungsi seperti Lwt_io.write
membuat janji. Konstruk let* ... in
digunakan untuk menunggu janji ditentukan; kode in
dijadwalkan untuk dijalankan dalam "panggilan balik". Lwt.pick
berlomba berjanji satu sama lain, dan berperilaku sebagai yang pertama menyelesaikan. Lwt_main.run
memaksa seluruh jaringan komputasi janji untuk dieksekusi. Semua kode OCaml yang terlihat dijalankan dalam satu thread, tetapi Lwt secara internal menggunakan kombinasi thread pekerja dan deskriptor file non-pemblokiran untuk menyelesaikan secara paralel janji-janji yang melakukan I/O.
Lwt mengkompilasi ke kode asli di Linux, macOS, Windows, dan sistem lainnya. Itu juga secara rutin dikompilasi ke JavaScript untuk front end dan Node oleh js_of_ocaml.
Di Lwt,
Lwt
memberikan janji...Lwt_unix
yang mengikat hampir setiap panggilan sistem Unix. Modul tingkat yang lebih tinggi Lwt_io
menyediakan saluran I/O yang bagus.Lwt_process
untuk penanganan subproses.Lwt_preemptive
memunculkan thread sistem.Lwt_react
untuk pemrograman reaktif. Lihat daftar isi pada halaman manual yang ditautkan! libev-dev
atau libev-devel
.opam install conf-libev lwt
Kami sedang berupaya meningkatkan dokumentasi Lwt (secara drastis; kami sedang menulis ulang manualnya). Sementara itu:
Catatan: sebagian besar manual saat ini mengacu pada 'a Lwt.t
sebagai "benang ringan" atau hanya "benang". Ini akan diperbaiki di manual baru. 'a Lwt.t
adalah sebuah janji, dan tidak ada hubungannya dengan sistem atau thread preemptive.
Buka terbitan, kunjungi obrolan Discord, tanyakan di diskusi.ocaml.org, atau di Stack Overflow.
Pengumuman rilis dibuat di diskusi.ocaml.org. Menonton repo untuk "Hanya rilis" juga merupakan sebuah pilihan.
CONTRIBUTING.md
berisi tip untuk mengerjakan kode, seperti cara memeriksa kode, cara kerja peninjauan, dll. Ada juga garis besar basis kode tingkat tinggi.