Lwt — это библиотека параллельного программирования для OCaml. Он предоставляет единственный тип данных: обещание , которое представляет собой значение, которое будет определено в будущем. Создание обещания порождает вычисления. Когда это вычисление представляет собой ввод-вывод, Lwt запускает его параллельно с вашим кодом OCaml.
Код OCaml, включая создание и ожидание выполнения обещаний, по умолчанию выполняется в одном потоке, поэтому вам не нужно беспокоиться о блокировке или вытеснении. По вашему желанию вы можете отделить код для запуска в отдельных потоках.
Вот упрощенная программа Lwt, которая запрашивает главную страницу Google и завершается ошибкой, если запрос не выполняется в течение пяти секунд:
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 *)
В программе такие функции, как Lwt_io.write
создают промисы. Конструкция let* ... in
используется для ожидания определения обещания; код после in
запланирован для выполнения в «обратном вызове». Lwt.pick
сравнивает обещания друг с другом и ведет себя как выполнивший первым. Lwt_main.run
принудительно выполняет всю сеть вычислений обещаний. Весь видимый код OCaml выполняется в одном потоке, но Lwt внутренне использует комбинацию рабочих потоков и неблокирующих файловых дескрипторов для параллельного разрешения промисов, выполняющих ввод-вывод.
Lwt компилируется в собственный код в Linux, macOS, Windows и других системах. Он также регулярно компилируется в JavaScript для внешнего интерфейса и Node с помощью js_of_ocaml.
В ЛВТ,
Lwt
обещает...Lwt_unix
, которая связывает почти каждый системный вызов Unix. Модуль более высокого уровня Lwt_io
предоставляет удобные каналы ввода-вывода.Lwt_process
предназначен для обработки подпроцессов.Lwt_preemptive
порождает системные потоки.Lwt_react
для реактивного программирования. См. оглавление на связанных страницах руководства! libev-dev
или libev-devel
.opam install conf-libev lwt
В настоящее время мы работаем над улучшением документации Lwt (кардинально; мы переписываем руководство). В это время:
Примечание: большая часть текущего руководства называет 'a Lwt.t
«легкими потоками» или просто «потоками». Это будет исправлено в новом руководстве. 'a Lwt.t
— это обещание и не имеет ничего общего с системой или вытесняющими потоками.
Откройте проблему, посетите чат Discord, задайте вопрос на дискуссиях.ocaml.org или в Stack Overflow.
Объявления о выпуске размещаются на дискуссиях.ocaml.org. Также можно просмотреть репозиторий «Только выпуски».
CONTRIBUTING.md
содержит советы по работе с кодом, например, как проверить код, как работает проверка и т. д. Также имеется общее описание базы кода.