Skip to content

Lwt

Lwt — библиотека для конкурентного программирования, посредством промисов. Помимо возможностей асинхронного взаимодействия с вводом-вывода (I/O), позволяет распараллелить этот процесс.

Основное руководство находится на сайте Ocsigen и переодически обновляется.

Пример

Оф. пример Lwt-программы, которая запрашивает первую страницу Google и терпит неудачу, если запрос не завершен в течение пяти секунд:

ocaml
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\r\n" in
      let* () = write outgoing "Connection: close\r\n\r\n" 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 *)

Полезности

  • Препроцессинг для do-подобного синтаксиса (ppx_lwt):
    ocaml
    let%lwt user = get_user_from_api "dad" in
    (* ... *)
    send_message "some text";%lwt